Самый распространенный способ выполнить запрос с помощью GROUP BY — просмотреть всю таблицу или индекс и извлечь из него только уникальные значения. Существует две стратегии выполнения этого запроса.

Хеш-таблица в памяти

Этот метод обычно используется, когда запросу необходимо сгруппировать данные по столбцу без индекса. В процессе группировки создается хеш-таблица, в которой ключи представляют уникальные значения столбцов.

При выполнении запроса СУБД сканирует строки, вычисляет хэш для каждого значения в столбце и сохраняет количество встреченных значений для каждого элемента в хеш-таблице.

Хотя этот метод может быть ресурсоемким для больших наборов данных, часто это самый быстрый подход, когда на сервере достаточно памяти для хранения хэш-таблицы.

Агрегация потоков

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

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

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

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

Что такое свободное сканирование?

Loose Scan — это метод оптимизации в MySQL, который хорошо подходит для операций GROUP BY, особенно в сценариях, где количество уникальных значений в стеке относительно невелико по сравнению с общим количеством строк в таблице.

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