Вопрос по mysql – Почему строки, возвращаемые «объяснением», не равны count ()?

10
    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 | 
+----+-------------+---------+-

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

возможный дубликатEXPLAIN and COUNT returning two different values RAS

Ваш Ответ

3   ответа
4

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

13

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

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

Это очень полезная информация, например, когда вы выполняете СОЕДИНЕНИЕ для многих таблиц, и вы хотите быть уверены, что вы не просматриваете всю объединенную таблицу для одной строки информации для каждой имеющейся у вас строки.

Вот тест таблицы 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
Error: User Rate Limit Exceeded ZA.
Error: User Rate Limit Exceeded ZA.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded ZA.
6

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

Похожие вопросы