Значение оптимизированных таблиц Select в MySQL Объяснить план

Что означает Select tables optimized away в плане объяснения MySQL?

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


person Chandra Patni    schedule 02.01.2010    source источник
comment
Я получил тот же результат в таблице InnoDB при выполнении запроса, похожего на: SELECT MAX(k3) FROM t1 WHERE k1='1' AND k2='2', где k1,k2 и k3 являются частями ключа.   -  person Ghostrider    schedule 24.07.2010


Ответы (7)


Это означает, что вы выполнили запрос, который не делает ничего, кроме подсчета количества строк в таблице, и эта таблица является таблицей MyISAM. Таблицы MyISAM хранятся с отдельным счетчиком строк, поэтому для выполнения этого запроса MySQL вообще не нужно просматривать какие-либо данные строки таблицы. Вместо этого он немедленно возвращает предварительно рассчитанное количество строк. Следовательно, доступ к таблице «оптимизирован», а запрос выполняется молниеносно.

То же самое не произойдет с другими механизмами хранения в MySQL, такими как InnoDB. Но на самом деле вы хотите использовать InnoDB, а не MyISAM в большинстве случаев по целому ряду других причин. (И даже без оптимизации подсчета строк такой запрос выполняется очень и очень быстро.)

select count(comment_count) from wp_posts;

Это то, что вы действительно хотели сделать? Это то же самое, что просто SELECT COUNT(*)... (при условии, что comment_count не может быть NULL, чего не может быть, иначе у вас не было бы оптимизации). Если вам нужно общее количество comment_count, вам следует использовать SUM(comment_count), и вы не получите поведения «оптимизированного отсутствия».

person bobince    schedule 02.01.2010
comment
Если это и было правдой, то сейчас это не так. Я получаю это сообщение от EXPLAIN для одной таблицы Innodb — MySQL 5.5.17. - person Riedsio; 30.09.2011
comment
Я также получаю это сообщение от EXPLAIN из SELECT в одной таблице InnoDB. - person Eric R. Rath; 04.05.2012
comment
Разве select count (имя поля) не должен быть более эффективным, чем select count (*)? - person jsh; 06.01.2014
comment
Это происходит и с другими движками, включая InnoDB. Я действительно сталкиваюсь с этим сейчас. - person Christopher McGowan; 24.08.2015
comment
Я вижу это с таблицей InnnoDB (MySQL 5.7) - так что, по-видимому, часть То же самое не произойдет с другими механизмами хранения не соответствует действительности, по крайней мере, больше. - person a_horse_with_no_name; 12.09.2016
comment
в дополнение к тому, что сказал @Riedsio, я получаю это на select max, что означает, что это происходит не просто при подсчете строк, а также при получении данных из этой строки. - person user10089632; 25.12.2017
comment
Это сообщение может появиться для запросов на основе таблиц InnoDB, которые имеют индекс, который охватывает весь запрос, что делает его поведение похожим на таблицу MyISAM в том смысле, что не нужно касаться фактической таблицы. - person egalvan10; 12.02.2019

Из документации MySQL:

Запрос содержал только агрегатные функции (MIN(), MAX()), которые были разрешены с использованием индекса или COUNT(*) для MyISAM, и не содержал предложения GROUP BY. Оптимизатор определил, что должна быть возвращена только одна строка.

В основном это означает, что ваш запрос использует данные, которые непосредственно доступны для MySQL, и запрос будет выполняться в постоянное время.

person Leolo    schedule 30.09.2011

Это означает, что таблица полностью оптимизирована вне запроса. Вы не можете стать лучше, чем это.

person OMG Ponies    schedule 02.01.2010

Принятый ответ и ответ, получивший наибольшее количество голосов, похоже, предполагают, что этот тип объяснения применим только к таблицам 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 отсутствует. . (Это пример неявно сгруппированного запроса, когда подсистема хранения влияет на возможность чтения детерминированного числа строк.)'

person Devang Mehta    schedule 19.06.2016

Для таблиц innodb я видел «Выбрать оптимизированные таблицы» при поиске минимального или максимального значения столбца с auto_increment. В information_schema.tables сохраняется максимальное значение auto_increment, поэтому оптимизатору легко просто заглянуть туда и никогда не касаться пользовательской таблицы. Это не сработает для таких вещей, как количество, потому что могут быть пробелы, поэтому оптимизатор должен обратиться к пользовательской таблице за ответом.

person Mike W.    schedule 28.12.2017

Трудно сказать, не видя ваш запрос, но это было бы следствием, если бы вы, например, выбрали постоянное значение -

ВЫБЕРИТЕ 1 ИЗ таблицы

или одна или несколько ваших таблиц не требуются для ответа на вопрос.

person dkretz    schedule 02.01.2010

Я не уверен, что таблица полностью оптимизирована из запроса. Этот запрос выбирает «wm.task_inst_params» как table_name, количество (id) из wm.task_inst_params; работает 18 минут. В таблице 224788138 строк.

И если я попытаюсь получить план объяснения, чтобы понять, почему это занимает так много времени, я получаю следующее: Не могу объяснить план: выберите оптимизированные таблицы.

innodb_версия 8.0.11

person Dean Thomsen    schedule 10.01.2021