Supponiamo di avere una query come questa ...Come faccio a dire a MySQL Optimizer di usare l'indice su una tabella derivata?
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)
Più persone possono essere assegnati a un determinato compito. Lo scopo di questa ricerca è quello di mostrare una riga per ogni compito, ma con le persone assegnate al compito in una singola colonna
Ora ... si supponga di avere la messa a punto indici corretti sulla tasks
, users
e tasks_assigned_users
. MySQL Optimizer non utilizzerà ancora l'indice TaskID quando si aggiunge tasks
alla tabella derivata. WTF?!?!?
Quindi, la mia domanda è ... come si può fare questa query utilizzare l'indice su tasks_assigned_users.TaskID? Le tabelle temporanee sono zoppe, quindi se questa è l'unica soluzione ... l'ottimizzatore MySQL è stupido.
indici utilizzati:
- compiti
- PRIMARIE - TaskID
- utenti
- PRIMARIE - UserID
- tasks_assigned_users
- PRIMARIA - (TaskID, UserID)
- indice aggiuntivo UNIQUE - (UserID, TaskID)
EDIT: Inoltre, this page dice che le tabelle derivate vengono eseguiti/materializzato si unisce prima verifica . Perché non riutilizzare i tasti per eseguire il join?
EDIT 2: MySQL Optimizer non vi permetterà di mettere index hints sulle tabelle derivate (presumibilmente perché non ci sono indici sulle tabelle derivate)
EDIT 3: Ecco un post veramente bella di questo : http://venublog.com/2010/03/06/how-to-improve-subqueries-derived-tables-performance/ Si noti che il caso n. 2 è la soluzione che sto cercando, ma sembra che MySQL non lo supporti in questo momento. :(
EDIT 4: Appena trovato this: "A partire da MySQL 5.6.3, l'ottimizzatore gestisce in modo più efficiente subquery nella clausola FROM (vale a dire, le tabelle derivate): ... Durante l'esecuzione di query, l'ottimizzatore è possibile aggiungere un indice a una tabella derivata per accelerare il recupero di righe da esso. "Sembra promettente ...
Puoi anche aggiungere gli indici che stai utilizzando? Presumo che tu abbia un PK sulle attività e un indice non univoco su tasks_assigned_users. – Luis
@Luis - modifica la domanda per te :) – BMiner
Hai ID attività di GROUP BY, che implica che più persone potrebbero lavorare su una determinata attività, il che implica anche un'aggregazione. Vuoi che tutte le persone assegnate a una determinata attività siano elencate in un'unica colonna di ritorno associata all'attività? Oppure, vuoi veramente vedere tutti assegnati a un compito, e quelle attività non assegnate, fallo vuoto. Forse anche spingere qualsiasi attività UNASSIGNED in cima (o in fondo) alla lista ... – DRapp