Come faccio a dire all'ottimizzatore MySQL di utilizzare l'indice su una tabella derivata?
-
30-10-2019 - |
Domanda
Supponiamo di avere una domanda come questa ...
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 assegnate a un determinato compito. Lo scopo di questa query è mostrare una riga per attività, ma con le persone assegnate all'attività in una singola colonna
Ora ... supponiamo di avere gli indici appropriati impostati su tasks
, users
, e tasks_assigned_users
. L'ottimizzatore MySQL non utilizzerà ancora l'indice TaskId quando si unisce tasks
al tavolo derivato. Wtf?!?!?
Quindi, la mia domanda è ... Come puoi far usare questa query su Dimensione_Assigned_users.Taskid? Le tabelle temporanee sono zoppi, quindi se questa è l'unica soluzione ... l'ottimizzatore MySQL è stupido.
Indici utilizzati:
- compiti
- Primaria - TaskId
- utenti
- Primaria - UserID
- Tasks_assigned_users
- Primary - (TaskId, UserId)
- UNIDE UNIDE UNDE - (userid, TaskId)
MODIFICARE: Anche, questa pagina dice che le tabelle derivate vengono eseguite/materializzate prima che si verifichino i join. Perché non riutilizzare le chiavi per eseguire il join?
EDIT 2: MySQL Optimizer non ti permetterà Suggerimenti indicizzati su tabelle derivate (presumibilmente perché non ci sono indici su tabelle derivate)
EDIT 3: Ecco un bel post sul blog su 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 questo: "A partire da MySQL 5.6.3, l'ottimizzatore gestisce in modo più efficiente le sottoquerie nella clausola from (cioè tabelle derivate): ... Durante l'esecuzione delle query, l'ottimizzatore può aggiungere un indice a una tabella derivata per accelerare il recupero delle righe da esso." Sembra promettente ...
Nessuna soluzione corretta