Spec-Zone.ru › MySQL 5.7

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_count с DISTINCT, 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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/distinct-optimization.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API