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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top