Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про PHP: aggregation, group by

Алгоритмы агрегации данных — как работает GROUP BY под капотом (на примере CSV-файла без БД)?

Этот вопрос объясняет алгоритмы, используемые для агрегации данных в операциях GROUP BY, на простом примере.

Короткий ответ

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

Длинный ответ

Понимание алгоритмов GROUP BY помогает оптимизировать запросы и понимать их производительность.

Алгоритмы выполнения GROUP BY:

  1. Hash Aggregation

    • Создание хеш-таблицы в памяти

    • Группировка по хешу ключа

    • Эффективно для больших данных без сортировки

  2. Sort-Based Aggregation

    • Сортировка данных по ключу группировки

    • Последовательная агрегация отсортированных данных

    • Эффективно при уже отсортированных данных

Пример реализации Hash Aggregation на PHP:

function groupByCSV($filename, $groupColumn, $aggregateColumn) {
    $groups = [];
    
    if (($handle = fopen($filename, "r")) !== FALSE) {
        $headers = fgetcsv($handle);
        $groupIndex = array_search($groupColumn, $headers);
        $aggIndex = array_search($aggregateColumn, $headers);
        
        while (($data = fgetcsv($handle)) !== FALSE) {
            $key = $data[$groupIndex];
            $value = (float)$data[$aggIndex];
            
            if (!isset($groups[$key])) {
                $groups[$key] = [
                    'count' => 0,
                    'sum' => 0,
                    'avg' => 0
                ];
            }
            
            $groups[$key]['count']++;
            $groups[$key]['sum'] += $value;
            $groups[$key]['avg'] = $groups[$key]['sum'] / $groups[$key]['count'];
        }
        fclose($handle);
    }
    
    return $groups;
}

Пример CSV данных:

department,salary
IT,5000
HR,4000
IT,6000
Sales,4500

Процесс обработки:

  1. Чтение строки, извлечение ключа (department)

  2. Поиск или создание группы в хеш-таблице

  3. Аккумуляция значений (сумма, счетчик)

  4. Вычисление агрегатов после обработки всех данных

Факторы выбора алгоритма:

  • Объем данных

  • Наличие индексов по ключу группировки

  • Доступная память

  • Требования к порядку результатов

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    3

  • Сложность:

    6

Навыки

  • PHP

    PHP

  • Postgres

    Postgres

Ключевые слова

#aggregation

#group by

Подпишись на PHP Developer в телеграм

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.