8.2.1.16 Оптимизация DISTINCT
DISTINCT в сочетании с ORDER
BY во многих случаях требует временной таблицы.
Поскольку DISTINCT может использовать GROUP
BY, ознакомьтесь с тем, как MySQL работает со столбцами в ORDER BY или HAVING, которые не являются частью выбранных столбцов. См. Раздел 12.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 см. Раздел 8.2.1.15, «Оптимизация 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.