Come posso sapere se un indice viene utilizzato per ordinare in MySQL?


10

Ho una query con una clausola ORDER BY che utilizza una colonna che è l'ultima colonna di un indice che viene utilizzata nella clausola WHERE, essenzialmente nella forma:

SELECT
  cols
FROM
  tables
WHERE
  col_1 = x
  AND col_2 = y
  AND col_3 = z
ORDER BY col_4

e l'indice viene creato su colonne (col_1, col_2, col_3, col_4) in questo ordine.

Quando profilo la query oltre il 99% del tempo è trascorso nello stato "Risultato dell'ordinamento". col_4 è una colonna timestamp se questo fa la differenza. Comprendo che ORDER BY può utilizzare un indice solo in determinate circostanze, ma sono ancora un po 'sconcertato su quando esattamente l'ottimizzatore lo farebbe.

Risposte:


13

Dovresti aggiungere EXPLAIN EXTENDEDprima della query e vedere tu stesso il risultato.

Dovrebbe avere una voce per

  • possible_keys

Se questa colonna è NULL, non ci sono indici rilevanti. In questo caso, potresti essere in grado di migliorare le prestazioni della tua query esaminando la clausola WHERE per verificare se si riferisce ad alcune colonne che sarebbero adatte per l'indicizzazione.

e

  • chiavi

La colonna chiave indica la chiave (indice) che MySQL ha effettivamente deciso di utilizzare. Se MySQL decide di utilizzare uno degli indici possible_keys per cercare le righe, tale indice viene elencato come valore chiave.

Per ulteriori informazioni è possibile fare riferimento a questo output Spiegazione e Spiegazione join_types


Capisco, la mia domanda in particolare, riguarda la clausola ORDER BY. La mia query utilizza l'indice specificato per limitare le righe restituite ma, date le prestazioni del tipo, suppongo che non lo stia utilizzando per la clausola ORDER BY.
Chris Cooper,

1
In alcuni casi, MySQL può utilizzare un indice per soddisfare una clausola ORDER BY senza eseguire ulteriori ordinamenti. L'indice può anche essere utilizzato anche se ORDER BY non corrisponde esattamente all'indice, purché tutte le parti non utilizzate dell'indice e tutte le colonne ORDER BY aggiuntive siano costanti nella clausola WHERE. Le seguenti query utilizzano l'indice per risolvere la parte ORDER BY: fare riferimento a dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
Mahesh Patil,

1

Usi EXPLAINsulla tua query ( explain select-or-whatever-your-query-is).

possible_keysmostra quelli che potrebbero essere utilizzati, keyquello effettivamente utilizzato.


1
Per aggiungere a ciò: explain format=json select ...è ancora più potente. Include used_key_parts, che indica se una chiave composita è stata utilizzata parzialmente o completamente e indica index_conditionquale parte della query è responsabile di quale indice.
Okdewit
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.