Pregunta

Supongamos que tienes una consulta como esta ...

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)

Se pueden asignar varias personas a una tarea determinada. El propósito de esta consulta es mostrar una fila por tarea, pero con las personas asignadas a la tarea en una sola columna

Ahora ... supongamos que tiene los índices adecuados configurados en tasks, users, y tasks_assigned_users. El optimizador MySQL aún no usará el índice TaskID al unirse tasks a la tabla derivada. Wtf?!?!?

Entonces, mi pregunta es ... ¿cómo puede hacer que esta consulta use el índice en tareas_assigned_users.taskid? Las tablas temporales son cojos, por lo que si esa es la única solución ... el optimizador MySQL es estúpido.

Índices utilizados:

  • Tareas
    • Primario - TaskID
  • usuarios
    • Primario - ID de usuario
  • tareas_assigned_users
    • Primario - (TaskID, UserId)
    • Índice adicional único - (UserId, TaskID)

EDITAR: También, esta página dice que las tablas derivadas se ejecutan/se materializan antes de que se produzcan uniones. ¿Por qué no reutilizar las claves para realizar la unión?

Editar 2: MySQL Optimizer no te dejará poner sugerencias de índice en tablas derivadas (presumiblemente porque no hay índices en tablas derivadas)

Editar 3: Aquí hay una muy buena publicación de blog sobre esto: http://venublog.com/2010/03/06/how-to-improve-subqueries-derived-leables-performance/ Observe que el caso #2 es la solución que estoy buscando, pero parece que MySQL no admite esto en este momento. :(

Editar 4: Se acaba de encontrar este: "A partir de MySQL 5.6.3, el optimizador maneja de manera más eficiente las subconsules en la cláusula DHO (es decir, tablas derivadas): ... Durante la ejecución de la consulta, el optimizador puede agregar un índice a una tabla derivada para acelerar la recuperación de la fila de eso." Parece prometedor ...

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top