È realistico avere così tante righe con lo stesso price
? È realistico restituire 444.000 righe da una query? Le chiedo perché l'ottimizzazione delle query si basa su dati "normali".
Un indice (ad es. INDEX(price)
) è utile quando si cerca un price
che si verifica un piccolo numero di volte. In effetti, l'Ottimizzatore evita l'indice se rileva che il valore cercato si verifica più del 20% circa delle volte. Invece, ignorerebbe semplicemente l'indice e farebbe prima ciò che hai testato:scansiona semplicemente l'intera tabella, ignorando le righe che non corrispondono.
Dovresti essere in grado di vederlo facendo
EXPLAIN select * from books where price = 10
con e senza indice. In alternativa, puoi provare:
EXPLAIN select * from books IGNORE INDEX(books_price_index) where price = 10
EXPLAIN select * from books FORCE INDEX(books_price_index) where price = 10
Ma, ... Sembra che l'Ottimizzatore non abbia ignorato l'indice. Vedo che la "cardinalità" di price
è "1", il che implica che esiste un solo valore distinto in quella colonna. Questa "statistica" è errata o fuorviante. Si prega di eseguire questo e vedere cosa cambia:
ANALYZE TABLE books;
Questo ricalcolerà le statistiche tramite alcune sonde casuali e può cambia quel "1" in forse "2".
Consiglio generale:fai attenzione ai benchmark che funzionano con dati fabbricati.