Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

A consulta do MySQL é mais lenta após a criação do índice


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