Подтвердить что ты не робот

Значение "Выбор таблиц оптимизировано" в 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 вывод отредактирован для удобочитаемости.

4b9b3361

Ответ 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

или одна или несколько ваших таблиц не должны отвечать на вопрос.