2012-06-12 11 views
7

Si consideri il seguente due spiega:Nessun indice su! =?

EXPLAIN SELECT * FROM sales WHERE title != 'The' 

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  sales ALL  title  NULL NULL NULL 41707 Using where 

E -

EXPLAIN SELECT * FROM sales WHERE title = 'The' 
id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  sales ref  title   title 767 const 1 Using where 

Perché la query != ha una chiave NULL? Perché non usa title? Che cosa causa un'istruzione = per poter utilizzare un indice ma non uno !=?

risposta

11

Non è necessario utilizzare l'indice a meno che title sia esattamente 'The' molto frequentemente.

Poiché quasi tutte le righe devono essere selezionate, non si ottiene nulla dall'uso di un indice. Può essere davvero costoso utilizzare un indice, che è probabilmente quello che sta determinando il tuo motore MySQL, quindi sta scegliendo di non usare l'indice.

Confrontare la quantità di lavoro svolto in queste due situazioni:

Utilizzando l'indice:

1) Leggere l'intero albero indice in memoria.
2) Cercare l'albero dell'indice per il valore 'The' e filtrare quelle voci.
3) Leggere tutte le righe tranne le poche eccezioni (che probabilmente si trovano negli stessi blocchi sul disco delle righe che devono essere lette, quindi è probabile che l'intera tabella venga letta) dalla tabella in memoria.

Senza l'indice:

1) Leggere ogni riga in memoria e leggendo li filtrano qualsiasi dove title = 'The' dal risultato set

+1

elaborare tale - selezionare ogni riga in cui il titolo non è "The" restituirà comunque quasi tutte le righe nella tabella, quindi non ha senso utilizzare un indice per questa query. (Dato che dovrai eseguire la scansione dell'intera tabella per restituire tutte quelle righe.) – duskwuff