Значение "Выбор таблиц оптимизировано" в MySQL Объясните план
В чем смысл Select tables optimized away
в MySQL Explain plan?
explain select count(comment_count) from wp_posts;
+----+-------------+---------------------------+-----------------------------+
| id | select_type | table,type,possible_keys, | Extra |
| | | key,key_len,ref,rows | |
+----+-------------+---------------------------+-----------------------------+
| 1 | SIMPLE | all NULLs | Select tables optimized away|
+----+-------------+---------------------------+-----------------------------+
1 row in set (0.00 sec)
Примечание: explain plan
вывод отредактирован для удобочитаемости.
Ответы
Ответ 1
Это означает, что вы выполнили запрос, который делает не что иное, как подсчет количества строк в таблице, и эта таблица является таблицей MyISAM. Таблицы MyISAM хранятся с отдельным числом строк, поэтому для выполнения этого запроса MySQL не нужно вообще смотреть на данные таблицы строк. Вместо этого он немедленно возвращает предварительно подсчитанный счетчик строк. Следовательно, доступ к таблице "оптимизирован", и запрос будет молниеносным.
То же самое не произойдет на других серверах хранения в MySQL, таких как InnoDB. Но на самом деле вы хотите использовать InnoDB, а не MyISAM в большинстве случаев по ряду других причин. (И даже без оптимизации подсчета строк этот вид запроса очень и очень быстрый.)
select count(comment_count) from wp_posts;
Это то, что вы действительно хотели сделать? То же самое, что только SELECT COUNT(*)...
(при условии, что comment_count
не может быть NULL
, чего не может быть, или у вас не было бы оптимизации). Если вы хотите в общей сложности comment_count
s, вы должны использовать SUM(comment_count)
, и вы не получите "оптимизированное поведение".
Ответ 2
Из документации MySQL:
Запрос содержал только агрегатные функции (MIN(), MAX()), которые были все разрешено с использованием индекса, или COUNT (*) для MyISAM, и без GROUP BY пункт. Оптимизатор определил, что нужно возвращать только одну строку.
В основном это означает, что ваш запрос использует данные, которые напрямую доступны для MySQL, и запрос будет выполняться в постоянное время.
Ответ 3
Это означает, что таблица полностью оптимизирована из запроса. Вы не можете добиться лучшего.
Ответ 4
Принятый ответ и самый верный ответ, похоже, предполагают, что этот тип объяснений применим только к таблицам MyISAM. Но я вижу это с таблицей InnoDB.
Я просмотрел документацию mysql для версии 5.6, https://dev.mysql.com/doc/refman/5.6/en/explain-output.html#explain_extra
Я не вижу, чтобы объяснение было ограничено MyISAM. Но в конкретном случае COUNT (*) есть примечание, в котором говорится, что этот тип объяснения станет действительным в случае, если таблица является MyISAM.
'Для систем хранения, которые поддерживают точное количество строк в таблице (например, MyISAM, но не InnoDB), это дополнительное значение может возникать для запросов COUNT (*), для которых отсутствует предложение WHERE или всегда верно, и нет Предложение GROUP BY. (Это экземпляр неявно сгруппированного запроса, в котором механизм хранения влияет на возможность считывания детерминированного числа строк.) '
Ответ 5
Для таблиц innodb я видел, как "Select tables optimized away" при поиске минимального или максимального числа столбца с auto_increment. В файлах information_schema.c содержится максимальное значение auto_increment, поэтому для оптимизатора просто просто посмотреть и никогда не прикасаться к пользовательской таблице. Он не будет работать для таких вещей, как count, потому что могут быть пробелы, поэтому оптимизатор должен пойти в таблицу пользователя для ответа.
Ответ 6
Трудно сказать, не видя ваш запрос, но это было бы последствием, если вы, например, выбрали постоянное значение -
SELECT 1 FROM atable
или одна или несколько ваших таблиц не должны отвечать на вопрос.