Почему строки, возвращаемые методом «объяснение», не равны count ()? - PullRequest
10 голосов
/ 24 июня 2009
    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 | 
+----+-------------+---------+-

Я думаю, что "объясните, выберите * из таблицы, где отношение_title = 'xxxxxxxxx';" возвращает строки отношения_титли = 'ххххххххх' по индексу. Но это меньше, чем истинное число.

Ответы [ 3 ]

13 голосов
/ 24 июня 2009

Показывает, сколько строк он пробежал, чтобы получить ваш результат.

Причиной неверных данных является то, что EXPLAIN не точен, он делает предположения о ваших данных на основе информации, хранящейся о вашей таблице.

Это очень полезная информация, например, когда вы выполняете JOINS для многих таблиц, и вы хотите быть уверены, что вы не просматриваете всю объединенную таблицу для одной строки информации для каждой вашей строки.

Вот тест для таблицы строк 608.

SELECT COUNT(id) FROM table WHERE user_id = 1

Результат:

COUNT(id)
512

А вот и объяснение

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

Результат:

id  rows
1   608
6 голосов
/ 24 июня 2009

В запросе EXPLAIN будет использоваться значение, указанное в таблице INFORMATION_SCHEMA, которая содержит приблизительную оценку количества строк для таблиц innodb - см. Раздел примечаний в документах mysql на INFORMATION_SCHEMA.TABLES .

4 голосов
/ 12 августа 2017

Выполнить ANALYZE TABLE table_name; - обновит статистику, которую использует EXPLAIN, и вы получите правильные цифры. Например: если в таблице вообще нет данных, EXPLAIN предложит, чтобы эта таблица была пустой, и оптимизирует запросы для фильтрации в первую очередь на основе этой таблицы (поскольку она ничего не читает с диска, памяти и т. Д.). Затем, когда данные будут загружены, если вы не выполните ANALYZE TABLE table_name;, оптимизатор по-прежнему предполагает, что таблица по-прежнему пуста, и не использует оптимальный план выполнения для запроса. EXPLAIN ведет себя так же - он не ищет текущий счетчик строк в таблице, он ищет статистику, сгенерированную ANALYZE TABLE table name (которая в некоторых ситуациях выполняется автоматически - например, 1/16 количества строк в таблице изменилось).

...