@entermix

Насколько дорогая операция GROUP BY() + SUM()?

Допустим есть таблица:

statistics
date (int), user_id(int), param1(int), param2(int), param3(int) ...


Настроены индексы:
uniq_user_id_date
fk_user_id

Делаем примерно такую выборку:
$sql_date_format = '%Y-%m';
// $sql_date_format = '%Y-%m-%u';
// $sql_date_format = '%Y-%m-%d %H:00:00';
// ...
        $statistics_obj = DB::select()
            ->select(
                ['date', 'date'],
                [DB::expr('DATE_FORMAT(FROM_UNIXTIME(`date`), :date_format)', [
                    ':date_format' => $sql_date_format,]), 'date_formatted',],
                [DB::expr('SUM(`param1`)'), 'param1']
            )
            ->from(ORM::factory('Statistic')->table_name())
            ->where('user_id', '=', $user->id)
            ->and_where('date', 'BETWEEN', [$this->_start, $this->_end])
            ->group_by('date_formatted')
            ->as_object()
            ->execute();


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

UPD: Эта информация будет использована для построения графиков (живая статистика в ЛК). Графики и таблицы (по часам/по неделям/по месяцам/по годам)
  • Вопрос задан
  • 281 просмотр
Решения вопроса 1
ApeCoder
@ApeCoder
Не важно, сколько в таблице записей вообще. У вас есть условие по пользователю и дате и индекс по этой паре, соотвественно, группировка будет только внутри диапазона дат и по данному пользователю.

Группировка сделана по форматированной дате, вряд ли MariaDB сможет сообразить что упорядочение по дате поможет, так что скорее всего, она сгруппирует это как неупорядоченное множество. Я думаю, если сгруппировать по исходной дате до группировка может быть быстрее - отформатировать можно и потом.

Как альтернатива, проиндексировать форматированную дату

Заполните таблицу примерно похожими по распределению данными и посмотрите план запроса.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@m0nym
Что значит в вашем представлении медленные?
Какое железо?
Какие индексы?

И че гадать-то - нагенерируйте случайных данных и проверьте.
Ответ написан
BojackHorseman
@BojackHorseman Куратор тега MySQL
...в творческом отпуске...
"медленно" - понятие относительное. на продакшн под нагрузку нельзя, а для отчетов раз в неделю прокатит
Ответ написан
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
Рано или поздно выборки становятся слишком жирными для построения отчетов/графиков/чего угодно на лету.

Может лучше сразу выбрать что-то более подходящее для этого
https://habr.com/company/oleg-bunin/blog/329062/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы