sql >> Base de Datos >  >> RDS >> Mysql

La consulta de MySQL es más lenta después de la creación del índice

¿Es realista tener tantas filas con el mismo price? ? ¿Es realista devolver 444K filas de una consulta? Pregunto esto porque la optimización de consultas se basa en datos "normales".

Un índice (p. ej., INDEX(price) ) es útil cuando se busca un price que ocurre un pequeño número de veces. De hecho, el optimizador evita el índice si ve que el valor que se busca aparece más del 20 % de las veces. En su lugar, simplemente ignoraría el índice y haría lo que probó primero:simplemente escanear toda la tabla, ignorando las filas que no coinciden.

Deberías poder verlo haciendo

EXPLAIN select * from books where price = 10

con y sin el índice. Alternativamente, puedes probar:

EXPLAIN select * from books IGNORE INDEX(books_price_index) where price = 10
EXPLAIN select * from books FORCE INDEX(books_price_index) where price = 10

Pero,... Parece que el Optimizer no ignoró el índice. Veo que la "cardinalidad" de price es "1", lo que implica que solo hay un valor distinto en esa columna. Esta 'estadística' es incorrecta o engañosa. Ejecute esto y vea qué cambios:

ANALYZE TABLE books;

Esto volverá a calcular las estadísticas a través de algunas pruebas aleatorias y puede cambie ese "1" a tal vez "2".

Consejo general:tenga cuidado con los puntos de referencia que se ejecutan contra datos fabricados.