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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top