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

La query MySQL è più lenta dopo la creazione dell'indice

È 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.