Почему строки, возвращаемые с помощью «объяснения», не равны 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 |
+----+-------------+---------+-
Я думаю, что «Объясните 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 от количества например, строки в таблице изменены).