Я выполняю агрегированный запрос, который занимает намного больше времени, чем ожидалось. Запрос из одной таблицы без объединений. Предложение where включает диапазон дат, предложение in
и столбец даты. В таблице всего около 5 тыс. Строк, а время запроса составляет 13 с.
Запрос:
select `site_id`, created_year_month_idx as time_column, count(*) as total
from `patients`
where `created_year_month_idx` between 20080101 and 20090101 and
`site_id` in (1,2,3) and
`patients`.`deleted_at` is null
group by `created_year_month_idx`, `site_id`
Когда я объясняю запрос, кажется, что он выполняет сканирование всей таблицы:
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
| --- | ----------- | -------- | ---------- | ----- | --------------------------------------------- | ------------------------------------- | ------- | --- | ---- | -------- | -------------------------------------------- |
| 1 | SIMPLE | patients | | range | site_id,patients_created_year_month_idx_index | patients_created_year_month_idx_index | 4 | | 1 | 100 | Using where; Using temporary; Using filesort |
Операторы создания таблицы:
CREATE TABLE `sites` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(10),
PRIMARY KEY (`id`)
);
CREATE TABLE `patients` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`site_id` int(10) unsigned NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
`created_year_month_idx` date GENERATED ALWAYS AS (date_format(`created_at`,'%Y-%m-01')) VIRTUAL,
PRIMARY KEY (`id`),
KEY `site_id` (`site_id`),
KEY `patients_created_year_month_idx_index` (`created_year_month_idx`),
CONSTRAINT `patients_site` FOREIGN KEY (`site_id`) REFERENCES `sites` (`id`)
);
Я создал скрипту БД в https://www.db-fiddle.com/f/4zbjFpMYXEGSviprQcaTm3/0
(кстати, если вы можете сказать мне, как отформатировать таблицу уценки в SO, я исправить вышеперечисленное)