É realista ter tantas linhas com o mesmo
price
? É realista retornar 444 mil linhas de uma consulta? Eu pergunto isso porque a otimização de consulta é baseada em dados "normais". Um índice (por exemplo,
INDEX(price)
) é útil ao procurar um price
que ocorre um pequeno número de vezes. Na verdade, o Otimizador evita o índice se perceber que o valor que está sendo pesquisado ocorre em mais de 20% das vezes. Em vez disso, ele simplesmente ignoraria o índice e faria o que você testou primeiro - simplesmente varre a tabela inteira, ignorando todas as linhas que não correspondem. Você deve ser capaz de ver isso fazendo
EXPLAIN select * from books where price = 10
com e sem índice. Alternativamente, você pode tentar:
EXPLAIN select * from books IGNORE INDEX(books_price_index) where price = 10
EXPLAIN select * from books FORCE INDEX(books_price_index) where price = 10
Mas,... Parece que o Optimizer não ignorou o índice. Vejo que a "cardinalidade" de
price
é "1", o que implica que há apenas um valor distinto nessa coluna. Esta 'estatística' é incorreta ou enganosa. Por favor, execute isso e veja o que muda:ANALYZE TABLE books;
Isso recalculará as estatísticas por meio de algumas sondagens aleatórias e pode mude esse "1" para talvez "2".
Conselho geral:Cuidado com benchmarks que são executados em dados fabricados.