E 'importante notare che l'ordine dei campi nell'indice è importante.
Un indice è, in un certo senso, un albero di ricerca. Se indicizzi (B.event, B.state), l'albero raggrupperà tutti i record con il campo "evento" di salvataggio, quindi li ordinerà con il campo "stato".
Se si dovesse interrogare quell'indice per "b.state = x", l'indice sarebbe di scarsa utilità; L'indice è ordinato prima dall'evento.
Nel tuo esempio:
- Un filtro da esso è "evento" campo
- unire A.event a B.event
- unire B.state a C.id
- Join B.hur = D.id
- Ordina per B.event, B.timestamp
e 'importante notare che l'ottimizzare esaminerà le statistiche delle vostre tabelle e indici, quindi può ri-organizzare l'ordine di i join Il risultato sarà lo stesso, ma l'ordine potrebbe dare prestazioni diverse e il lavoro degli ottimizzatori è cercare di trovare le migliori prestazioni.
Nel tuo caso, mi aspetto che l'ordine di B.event sia estremamente importante. Semplicemente perché questo è l'ordine dell'output risultante, ed è il campo da cui filtra.
Successivamente si entra in B.state in C.id. Quindi avere e indicizzare su C.id è buono, rende il join più veloce. Ma ugualmente, avere i dati della tabella B in un buon ordine può anche rendere il join più veloce.
Tuttavia, avere un indice su B.event e un indice separato su B.state può dare poco. L'indice B.state diventa quasi inutile perché stiamo usando l'indice B.event. Se si combinano i due in un indice (b.event poi b.state) il piano di esecuzione potrebbe trovare un modo per utilizzare la parte b.state dell'indice.
Infine, se si inseriscono tutti i campi nell'indice, l'indice diventa più grande, ma la query potrebbe non avere mai realmente bisogno di guardare la tabella. Le informazioni sono nell'indice. Il tempo impiegato per passare da un indice alla tabella per trovare i campi "mancanti" è simile a quello di un join. Pertanto, per le prestazioni di lettura, l'aggiunta di campi aggiuntivi all'indice può essere di notevole utilità.
sto Wittering adesso, ma la sintesi è questa:
- Di solito, indice separato su campi separati non abituarsi insieme
- Per gli indici compositi, nell'ordine specificato i campi fa la differenza
- L'aggiunta di campi "extra" all'indice lo rende più grande, ma può anche velocizzare le query
- L'ordine del piano di esecuzione è più importante dell'ordine della query
- Ma gli indici che hai possono determinare l'ordine di il piano di esecuzione
Questo tipo di lavoro ha nessuna risposta categoriale. È così dipendente dai tuoi dati che è più vicino a un'arte.
Un'opzione consiste nel caricare le tabelle con gli indici, osservare il piano di esecuzione risultante ed eliminare gli indici non necessari.
Ma anche qui si applica un avvertimento. Poiché il piano di esecuzione dipende dai dati (e dalle statistiche delle tabelle), è molto importante avere dati del mondo reale nelle tabelle. Mentre le tabelle hanno 10 o 100 di righe, un piano di esecuzione potrebbe essere il più veloce. Ma quando ottieni milioni di righe, il piano di esecuzione può cambiare e beneficiare quindi di diversi indici.
Correggere, ma controllare se B.timestamp verrebbe effettivamente utilizzato. – Pomyk
Quanto sono grandi ciascuna tabella e quante righe ci si aspetterebbe che corrispondano da una determinata query. Quale database stai usando? –
Inoltre, con quale frequenza vengono aggiunti i dati nelle tabelle e con quale frequenza si desidera eseguire la query? –