He configurado mi tabla con un índice solo en done_status (done_status = INT):
Cuando uso:
EXPLAIN SELECT * FROM reminder WHERE done_status=2
Me devuelve esto:
id select_type tipo de tabla possible_keys key key_len ref filas Extra 1 Recordatorio SIMPLE TODO done_status NULL NULL NULL 5 Uso de where
Pero cuando publico este comando:
EXPLAIN SELECT * FROM reminder WHERE done_status=1
Me devuelve lo siguiente:
id select_type tipo de tabla possible_keys key key_len ref filas Extra 1 Recordatorio SIMPLE ref done_status done_status 4 const 2
El EXPLAIN
me muestra que usa 5 filas, la segunda vez 2 filas.
No creo que se use el índice, si lo entendí bien la primera vez debería darme 3 filas. ¿Qué hago mal?
SHOW INDEX FROM reminder
:
Tabla Non_unique Key_name Seq_in_index Column_name Colation Cardinality Sub_part Packed Null Index_type Comment Index_comment recordatorio 1 done_status 1 done_status A 5 NULL NULL BTREE
explicar extendido:
id select_type tipo de tabla possible_keys key key_len ref filas filtradas Extra 1 Recordatorio SIMPLE ref done_status done_status 4 const 2 100.00
show warnings
no mostró nada de interés.
Respuestas:
No entiendes qué es el campo 'filas'. Es el número de filas que mysql estima que necesitará leer para satisfacer su consulta. Este valor puede ser bastante inexacto. No significa que este sea el número de filas en el resultado, o el número real de filas leídas por mysql
fuente
La primera ejecución simple no es utilizar el índice con seguridad,
podría ser la información_esquema.las estadísticas del índice no se ponen al día con los datos después de algunas operaciones de escritura, o no se accede a la tabla durante mucho tiempo.
como se explica aquí: - ¿ De dónde lee MySQL Query Optimizer las estadísticas del índice?
para el segundo plan de ejecución, parece que information_schema.statistics ya se pone al día y soluciona el problema de cardinalidad NULL.
Por lo tanto, se ejecuta la consulta de acuerdo con el optimizador de índice.
Para la tabla con filas pequeñas, no importa mucho.
Pero los datos crecerán, el desarrollador siempre debe verificar esto
y realizar la tabla de análisis necesaria cuando la cardinalidad del encuentro sea nula en el índice.
fuente
El primer plan de ejecución no está utilizando un índice.
Desde el sitio web de referencia de MySQL :
Si su tabla tiene solo 5 filas y su consulta selecciona 3 de ellas, entonces el optimizador de MySQL supone que es más eficiente escanear toda la tabla.
fuente