¿Por qué las filas devuelven por “explicar” no es igual a count ()?

mysql> select count(*) from table where relation_title='xxxxxxxxx'; +----------+ | count(*) | +----------+ | 1291958 | +----------+ mysql> explain select * from table where relation_title='xxxxxxxxx'; +----+-------------+---------+- | id | select_type | rows | +----+-------------+---------+- | 1 | SIMPLE | 1274785 | +----+-------------+---------+- 

Creo que “explicar select * from table donde relation_title = ‘xxxxxxxxx’;” devuelve las filas de relation_title = ‘xxxxxxxxx’ por índice. Pero es pequeño que el verdadero num.

Está mostrando cuántas filas ejecutó para obtener su resultado.

El motivo de los datos incorrectos es que EXPLAIN no es exacto, hace conjeturas sobre sus datos en función de la información almacenada sobre su mesa.

Esta es información muy útil, por ejemplo cuando se realiza UNIENDO en muchas tablas y desea asegurarse de que no esté ejecutando toda la tabla unida para obtener una fila de información para cada fila que tenga.

Aquí hay una prueba en una tabla de 608 filas.

 SELECT COUNT(id) FROM table WHERE user_id = 1 

Resultado:

 COUNT(id) 512 

Y aquí está la explicación

 EXPLAIN SELECT COUNT(id) FROM table WHERE user_id = 1 

Resultado:

 id rows 1 608 

La consulta EXPLAIN utilizará el valor proporcionado en la tabla INFORMATION_SCHEMA , que contiene una estimación aproximada del recuento de filas para las tablas innodb; consulte la sección de notas en documentos de mysql en INFORMATION_SCHEMA.TABLES .

Ejecute ANALYZE TABLE table_name; – Actualizará las estadísticas que utiliza EXPLAIN, y obtendrá los números correctos. Por ejemplo: cuando no hay datos en la tabla, EXPLAIN sugerirá que esta tabla está vacía y optimizará las consultas para filtrar primero basándose en esa tabla (ya que no lee nada del disco, memoria, etc.). Luego, cuando los datos se cargarán si no ejecuta ANALYZE TABLE table_name; , el optimizador aún sugiere que la tabla todavía está vacía y no utiliza un plan de ejecución óptimo para la consulta. EXPLAIN se comporta de la misma manera: no busca el recuento actual de filas en la tabla, busca las estadísticas generadas por el ANALYZE TABLE table name (que se ejecuta automáticamente en algunas situaciones – 1/16 del recuento de filas en la tabla modificada, por ejemplo) .