Как ускорить запрос sql - PullRequest
0 голосов
/ 16 июня 2020

У меня есть таблица, в которой перечислены рекламные действия по брендам. Каждое действие записывается одной записью, как показано в файле Excel, который вы можете увидеть в папке диска ниже. В таблице около 7мил записей. Я выполняю несколько запросов, которые выполняются нормально, но я столкнулся с проблемой с одним отчетом c. В этом отчете перечислены и ранжированы клиенты (столбец L в файле Excel) по общей сумме, потраченной на рекламу. Для создания этого отчета требуется около минуты, если установлен диапазон дат от двух месяцев до двух лет.

Ниже представлена ​​копия запроса

select customer_id, sum(value) as value 
from `data` 
where ((`date` >= '2019-01-01' and `date` <= '2019-12-31')) 
group by `customer_id` 
order by `value` desc, `customer_id` asc;

Создание этого отчета занимает около минуты, если установлен диапазон дат от 2 месяцев до двух лет. Если мой диапазон дат составляет один месяц или меньше, это займет менее 3 секунд.

Мне нужно, чтобы этот запрос обрабатывался максимум за 10-15 секунд. Мы пытались придумать такие идеи, как создание новой таблицы в БД специально для этого запроса, но мы наткнулись на стену, когда мы увидели, что нам все еще нужно хранить все записи дат, и поэтому мы не можем сгруппировать результаты в таблице.

Мы действительно открыты для любых идей, которые могли бы ускорить этот запрос, включая изменения БД.

Ниже приведена ссылка на папку, которая содержит копию структуры БД и образец набор данных, экспортированный из таблицы данных, которая содержит все данные.

Папка на диске

1 Ответ

1 голос
/ 16 июня 2020

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

CREATE INDEX `idx_data_date` ON `data`(`date`);
CREATE INDEX `idx_data_customer_id` ON `data`(`customer_id`);

Вам также следует избегать хранения дат в виде текста. По возможности используйте DATETIME.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...