Comment dire à l'optimiseur MySQL d'utiliser l'index sur une table dérivée?
-
30-10-2019 - |
Question
Supposons que vous ayez une question comme celle-ci ...
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)
Plusieurs personnes peuvent être affectées à une tâche donnée. Le but de cette requête est d'afficher une ligne par tâche, mais avec les personnes affectées à la tâche dans une seule colonne
Maintenant ... Supposons que vous ayez la configuration des index appropriés sur tasks
, users
, et tasks_assigned_users
. L'optimiseur MySQL n'utilisera toujours pas l'index TaskID lors de la jonction tasks
à la table dérivée. Wtf?!?!?
Donc, ma question est ... comment pouvez-vous faire en sorte que cette requête utilise l'index sur tasks_assigned_users.taskid? Les tables temporaires sont boiteuses, donc si c'est la seule solution ... l'optimiseur MySQL est stupide.
Index utilisés:
- Tâches
- Primaire - taskid
- utilisateurs
- Primaire - utilisateur
- tasks_assigned_users
- Primaire - (taskid, utilisateur)
- Index supplémentaire unique - (utilisateur, taskid)
ÉDITER: Aussi, cette page Dit que les tables dérivées sont exécutées / matérialisées avant les jointures. Pourquoi ne pas réutiliser les clés pour effectuer la jointure?
Edit 2: MySQL Optimizer ne vous laissera pas mettre indice d'index sur les tables dérivées (vraisemblablement parce qu'il n'y a pas d'index sur les tables dérivées)
Edit 3: Voici un très bon article de blog à ce sujet: http://venublig.com/2010/03/06/how-to-improve-subqueries-derived-tables-performance/ Notez que le cas n ° 2 est la solution que je recherche, mais il semble que MySQL ne prenne pas en charge cela pour le moment. :(
Edit 4: Viens juste de trouver cette: "Depuis MySQL 5.6.3, l'Optimiseur gère plus efficacement les sous-requêtes dans la clause From (c'est-à-dire les tables dérivées): ... Pendant l'exécution de la requête, l'optimiseur peut ajouter un index à un tableau dérivé pour accélérer la récupération de lignes à partir de ce." Semble prometteur ...
Pas de solution correcte