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

StackOverflow https://stackoverflow.com/questions/1037471

  •  10-07-2019
  •  | 
  •  

Вопрос

    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 * из таблицы, где uticle_title = 'xxxxxxxxx»; »;»; Возвращает ряды rethent_title = 'xxxxxxxxx' по индексу.Но это меньше истинного числа.

Это было полезно?

Решение

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

Причина неверных данных в том, что 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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top