10.2.1.18 Оптимизация DISTINCT
DISTINCT в сочетании с ORDER
BY во многих случаях требует временной таблицы.
Поскольку DISTINCT может использовать GROUP
BY, ознакомьтесь с тем, как MySQL работает со столбцами в ORDER BY или HAVING, которые не являются частью выбранных столбцов. См. Раздел 14.19.3, «Обработка GROUP BY в MySQL».
В большинстве случаев, оператор DISTINCT можно рассматривать как частный случай GROUP BY. Например, следующие два запроса эквивалентны:
SELECT DISTINCT c1, c2, c3 FROM t1
WHERE c1 > const;
SELECT c1, c2, c3 FROM t1
WHERE c1 > const GROUP BY c1, c2, c3;
Из-за этой эквивалентности оптимизации, применимые к запросам с GROUP BY, также могут быть применены к запросам с оператором DISTINCT. Таким образом, для получения более подробной информации об оптимизационных возможностях запросов с DISTINCT, обратитесь к Разделу 10.2.1.17, «Оптимизация GROUP BY».
При объединении LIMIT
с row_countDISTINCT, MySQL останавливается, как только найдет row_count уникальных строк.
Если вы не используете столбцы из всех таблиц, указанных в запросе, MySQL прекращает сканирование любых неиспользуемых таблиц, как только находит первое совпадение. В приведенном ниже случае, предполагая, что t1 используется до t2 (что можно проверить с помощью EXPLAIN), MySQL прекращает чтение из t2 (для любой конкретной строки в t1), когда находит первую строку в t2:
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;
© 2025 Oracle
Licensed under the GPLv2 License.