Оптимизировать SUM () И GROUP BY MySQL Запрос - PullRequest
1 голос
/ 30 января 2020

У меня есть таблица с 161886415 строк. Когда я запускаю:

SELECT * FROM table

Это занимает 0,0083 секунды.

Но когда я пытаюсь запустить:

SELECT A, SUM(B) 
FROM table 
GROUP BY A

Это занимает бесконечное время

У меня уже есть индекс A и B, AB и BA составной индекс

A - date и B - int.

Ответы [ 3 ]

4 голосов
/ 30 января 2020

Ваше сравнение вводит в заблуждение. Когда у вас есть такой запрос:

select a.*
from table;

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

Вы можете обнаружить, что запрос агрегации выполняется быстрее, если у вас индекс на (A, B). Но, похоже, у вас уже есть этот индекс.

Практически лучший вариант - отфильтровать до подмножества дат.

0 голосов
/ 01 февраля 2020

Ваш первый запрос вернул все 181 миллион строк за 8,3 миллисекунды. Я думаю, что нет.

Второй запрос, как вы увидите из EXPLAIN SELECT ..., эффективно использует INDEX(A, B). Тем не менее, ему нужно прочитать все 181 «строк» ​​в этом индексе, поэтому это занимает много времени.

Часто в приложениях хранилища данных полезно создавать и поддерживать «сводные таблицы», чтобы ускорить процесс - значительно. Вы можете иметь ежедневный промежуточный итог SUM(B) для каждого A, а затем суммировать промежуточные итоги, когда вам это нужно.

Если вы хотите обсудить что-то далее, предоставьте больше подробностей в таблице и запросе.

0 голосов
/ 30 января 2020

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

Вы должны посмотреть в своем плане запросов, какой оператор агрегирования используется. Кроме того, вы можете редактировать свой оригинальный пост.

Индекс может быть полезным. MariaDB предлагает колонку магазина, например. Зависит от запроса и ваших ожиданий скорости.

Аналогичная проблема, связанная с производительностью SUM () Можно ли ускорить сумму () в MySQL?

...