Suponga que tiene una consulta como esta ...¿Cómo le digo a MySQL Optimizer que use el índice en una tabla derivada?
SELECT T.TaskID, T.TaskName, TAU.AssignedUsers
FROM `tasks` T
LEFT OUTER JOIN (
SELECT TaskID, GROUP_CONCAT(U.FirstName, ' ',
U.LastName SEPARATOR ', ') AS AssignedUsers
FROM `tasks_assigned_users` TAU
INNER JOIN `users` U ON (TAU.UserID=U.UserID)
GROUP BY TaskID
) TAU ON (T.TaskID=TAU.TaskID)
Varias personas pueden ser asignados a una tarea determinada. El propósito de esta consulta es mostrar una fila por cada tarea, pero con las personas asignadas a la tarea de una sola columna
Ahora ... suponga que tiene la configuración de índices adecuados en tasks
, users
, y tasks_assigned_users
. El Optimizador de MySQL aún no usará el índice TaskID cuando se una al tasks
en la tabla derivada. ¿WTF?!?!?
Entonces, mi pregunta es ... ¿cómo se puede hacer que esta consulta use el índice en tasks_assigned_users.TaskID? Las tablas temporales son cojas, así que si esa es la única solución ... el MySQL Optimizer es estúpido.
índices utilizados:
- tareas
- PRIMARIA - TaskID
- usuarios
- PRIMARIA - ID de usuario
- tasks_assigned_users
- PRIMARIA - (TaskID, UserID)
- adicional de índices UNIQUE - (UserID, TaskID)
EDIT: También, this page dice que las tablas derivadas se ejecutan/materializado antes se une a ocurrir . ¿Por qué no volver a utilizar las teclas para realizar la unión?
EDIT 2: MySQL Optimizer no le permitirá poner en index hints tablas derivadas (presumiblemente porque no hay índices en las tablas derivadas)
Datos 3: Aquí es un muy buen post sobre este : http://venublog.com/2010/03/06/how-to-improve-subqueries-derived-tables-performance/ Observe que el Caso # 2 es la solución que estoy buscando, pero parece que MySQL no es compatible con esto en este momento. :(
EDITAR 4: Sólo encontró this: "A partir de MySQL 5.6.3, el optimizador maneja de manera más eficiente subconsultas en la cláusula FROM (es decir, las tablas derivadas): ... Durante la ejecución de consulta, el optimizador puede agregar un índice a una tabla derivada para acelerar la recuperación de filas. "Parece prometedor ...
¿Puede también agregar los índices que está utilizando? Supongo que tiene un PK en tareas y un índice no único en tasks_assigned_users. – Luis
@Luis: editó la pregunta :) – BMiner
Tiene ID de tarea GROUP BY, lo que implica que varias personas podrían estar trabajando en una tarea determinada, lo que también implica cierta agregación. ¿Desea que todas las personas asignadas a una tarea determinada se enumeren en una sola columna de retorno asociada a la tarea? O bien, ¿realmente desea ver a todos asignados a una tarea, y esas tareas sin asignar, en blanco? Tal vez incluso empujar cualquier tarea SIN ASIGNACIÓN a la parte superior (o inferior) de la lista ... – DRapp