Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL non utilizza l'indice durante il controllo =1 , ma lo utilizza con =0

Perché MySQL non utilizza un indice?
MySQL non utilizzerà un indice se una percentuale elevata delle righe hanno quel valore.

Perché aggiungere use index alla query non funziona qui
Aggiunta di un use index la clausola non avrà alcun effetto, perché use index suggerirà solo quale indice da utilizzare, non suggerirà se utilizzare un indice o meno.

Avvertenza quando si utilizzano tabelle di test con poche righe
Ciò è particolarmente fastidioso quando si utilizzano tabelle di test con poche righe poiché MySQL si rifiuterà di utilizzare un indice ed è difficile vedere cosa c'è che non va nella tua query.
Quindi assicurati di aggiungere abbastanza righe a una tabella di test per renderlo un test realistico.

L'utilizzo di un indice su colonne a cardinalità bassa è inutile?
L'indicizzazione su colonne booleane non è così utile come pensavi prima di fare questa domanda.
Comunque non è nemmeno inutile o.
Con InnoDB MySQL proverà a recuperare i dati utilizzando gli indici se possibile, se il tuo campo booleano ha un indice la query:

SELECT id, bool_field FROM table_with_many_columns_and_rows WHERE bool_field = 1

Può leggere tutti i dati nell'indice di copertura per bool_field perché gli indici secondari in InnoDB includono sempre l'indice primario (id) anche.
Questo è più veloce perché MySQL non deve leggere l'intera tabella in memoria.

In MyISAM questo non funziona e MySQL esaminerà l'intera tabella.

Ma posso usare force index
Puoi, ma su indici a cardinalità bassa renderà la tua query più lenta, non più veloce. Sostituisci gli indici solo su query complesse e solo se conosci le regole che MySQL usa per selezionare gli indici.

Link:
Vedi:http://dev.mysql .com/doc/refman/5.1/en/mysql-indexes.html
e: http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

Se vuoi un libro su questo argomento:leggi
MySQL ad alte prestazioni:http://oreilly.com /catalog/9780596003067