Spec-Zone .ru
спецификации, руководства, описания, API

8.13.16.3. Оптимизация Подзапросов в FROM Пункт (DerivedTables)

С MySQL 5.6.3 оптимизатор более эффективно обрабатывает подзапросы в FROM пункт (то есть, полученные таблицы):

Рассмотрите следующий EXPLAIN оператор, для которого подзапрос появляется в FROM пункт a SELECT запрос:

EXPLAIN SELECT * FROM (SELECT * FROM t1);

Оптимизатор избегает осуществлять подзапрос, задерживая это, пока результат не необходим во время SELECT выполнение. В этом случае запрос не выполняется, таким образом, результат никогда не необходим.

Даже для запросов, которые выполняются, задержка материализации подзапроса может разрешить оптимизатору избегать материализации полностью. Рассмотрите следующий запрос, который присоединяется к результату подзапроса в FROM пункт к другой таблице:

SELECT * FROM t1  JOIN (SELECT t2.f1 FROM t2) AS derived_t2 ON t1.f2=derived_t2.f1  WHERE t1.f1 > 0;

Если оптимизация обрабатывает t1 сначала и WHERE пункт приводит к пустому результату, соединение должно обязательно быть пустым, и подзапрос не должен быть осуществлен.

В худшем случае (полученные таблицы осуществляются), запросите выполнение, займет то же самое время в качестве перед MySQL 5.6.3, потому что никакая дополнительная работа не делается. В лучшем случае (полученные таблицы не осуществляются), запросите выполнение, будет более быстрым к тому времени, когда необходимый выполнить материализацию.

Для случаев, когда материализация требуется для подзапроса в FROM пункт, оптимизатор может ускорить доступ к результату, добавляя индексирование к осуществленной таблице. Если такой индексировать разрешил бы ref доступ к таблице, это может значительно уменьшить объем данных, который должен быть считан во время выполнения запроса. Рассмотрите следующий запрос:

SELECT * FROM t1  JOIN (SELECT * FROM t2) AS derived_t2 ON t1.f1=derived_t2.f1;

Оптимизатор создает индексирование по столбцу f1 от derived_t2 если выполнение так разрешило бы использование ref доступ для самого низкого плана выполнения стоимости. После добавления индексирования оптимизатор может обработать осуществленную полученную таблицу то же самое как обычная таблица с индексированием, и это извлекает выгоду так же из сгенерированного, индексируют. Издержки создания индекса незначительны по сравнению со стоимостью выполнения запроса без индексирования. Если ref доступ привел бы к более высокой стоимости чем некоторый другой метод доступа, нет индексировал бы, создается, и оптимизатор ничего не теряет.