MySQL indici e ordine

Questa è una domanda che ho avuto per sempre.

Per quanto ne so l’ordine di indici materia. Così un indice come [first_name, last_name] non è la stessa [last_name, first_name], giusto?

Se ho solo definire il primo indice, significa che verrà utilizzato solo per

SELECT * FROM table WHERE first_name="john" AND  last_name="doe"; 

e non per

SELECT * FROM table WHERE  last_name="doe" AND first_name="john";

Poiché io sto usando un ORM, non ho idea in che ordine di queste colonne stanno per essere chiamati. Vuol dire che devo aggiungere indici su tutte le permutazioni? Che è fattibile se ho un 2 indice di colonna, ma cosa succede se il mio indice è di 3 o 4 colonne?



3 Replies
  1. 49

    Ordine di indice di questioni, quando la query condizioni si applicano solo a PARTE dell’indice. Considerare:

    1. SELECT * FROM table WHERE first_name="john" AND last_name="doe"

    2. SELECT * FROM table WHERE first_name="john"

    3. SELECT * FROM table WHERE last_name="doe"

    Se l’indice è (first_name, last_name) query 1 e 2, di utilizzo, di query #3 non.
    Se l’indice è (last_name, first_name) query 1 e 3 utilizzo, di query #2 non. Modificare la condizione di ordine all’interno della clausola WHERE non ha alcun effetto in entrambi i casi.

    Dettagli sono qui

    Aggiornamento:

    Nel caso di cui sopra non è chiaro – MySQL possibile utilizzare solo un indice, se le colonne nella query condizioni, modulo a sinistra prefisso dell’indice. Query #2 di cui sopra non può utilizzare (last_name, first_name) indice perché solo sulla base first_name e first_name NON è più a sinistra il prefisso (last_name, first_name) indice.

    L’ordine delle condizioni all’INTERNO della query non importa; la query #1 di cui sopra, sarà in grado di utilizzare (last_name, first_name) indice di bene, perché le sue condizioni sono first_name e last_name e, presi insieme, essi formano una sinistra prefisso (last_name, first_name) indice.

    • Quindi credo SELECT * FROM tabella WHERE cognome=”rossi” E first_name=”giovanni” non? Se questo è il caso, allora visto che tutte le query edificio è nascosto da mio ORM, probabilmente devo definire i 2 indici… che schifo davvero, perché ho un indice su 3 colonne per definire…
    • No, hai frainteso. DOVE last_name=”rossi” E first_name=”giovanni” query utilizzare (first_name, last_name) o (last_name, first_name) indici bene.
    • Una domanda: per una query con 2 E condizioni, non importa,velocità saggio,è l’indice è “invertita” rispetto alle condizioni della query, o no?O dipende dalla cardinalità di queste colonne?
    • Grande sintesi per una domanda comune
    • WHERE last_name = 'doe' and first_name LIKE 'j%'questo caso, INDEX(last_name, first_name) è migliore rispetto alle altre opzioni. Questo è a causa della “gamma” a first_name. Ricettario
  2. 5

    ChssPly76 è corretto che l’ordine di espressioni booleane non deve corrispondere l’ordine delle colonne nell’indice. Gli operatori booleani sono commutativa, e il MySQL query optimizer è abbastanza intelligente per sapere come la corrispondenza con l’espressione all’indice nella maggior parte dei casi.

    Voglio anche aggiungere che si dovrebbe imparare a utilizzare il SPIEGA funzionalità di MySQL in modo da poter vedere di persona gli indici in cui l’ottimizzatore sceglie per una determinata query.

    • MySQL Workbench mostra una rappresentazione grafica della EXPLAIN informazioni sotto Execution Plan.
  3. 2

    Perché non estendere la risposta un po ‘ per rendere completamente tutto cristallino in una sola volta.

    Se la tabella ha una colonna di più indice, qualsiasi sinistra prefisso dell’indice può essere utilizzato da query optimizer per trovare le righe. Per esempio, se si dispone di un tre-indice di colonna su (col1, col2, col3), di aver indicizzato ricerca di funzionalità di (col1), (col1, col2), e (col1, col2, col3).

    MySQL non è possibile utilizzare un indice se le colonne non si forma una sinistra prefisso dell’indice. Si supponga di avere le istruzioni SELECT mostrato qui:

    SELECT * FROM tbl_name WHERE col1=val1;
    SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
    
    SELECT * FROM tbl_name WHERE col2=val2;
    SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

    Se esiste un indice (col1, col2, col3), solo le prime due query utilizzare l’indice. La terza e la quarta query coinvolgere colonne indicizzate, ma (col2) e (col2, col3) non sono più a sinistra prefissi di (col1, col2, col3). – MySQL dev

Lascia un commento