Im используя запрос ниже, чтобы рассчитать 5 лучших расходов на каждую отдельную компанию и отсортировать их по убыванию. В настоящее время таблица имеет около 3 миллионов строк и занимает около 8 секунд для правильного выполнения. Я ищу способ ускорить это.Как я могу ускорить этот запрос SUM?
SELECT
SUM(cost) as sumw,
company FROM cost
WHERE
datetime BETWEEN '2016-10-01' AND '2016-12-01'
GROUP BY company
ORDER BY sumw desc
LIMIT 5;
datetime имеет индекс.
EXPLAIN:
1 SIMPLE cost NULL ALL datetime NULL NULL NULL 3204715 50.00 Using where; Using temporary; Using filesort
СОЗДАТЬ
CREATE TABLE `cost` (
`id` bigint(8) unsigned NOT NULL AUTO_INCREMENT,
`company` varchar(45) DEFAULT NULL,
`cost` bigint(8) unsigned DEFAULT NULL,
`datetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `datetime` (`datetime`)
) ENGINE=InnoDB AUTO_INCREMENT=3335830 DEFAULT CHARSET=utf8;
добавить оборудование; или генерировать итоговые данные ежедневно/ежечасно перед запросом. SQL выглядит так же эффективно, как и может быть. Может быть, перечислить строки в датах, чтобы она не косвенно делала это, но я не могу себе представить, что это принесет вам много. Вне MySQL я могу предложить материализованное представление с периодическим обновлением, но MySQL их не имеет. – xQbert
Обычно при запросе справки о производительности SQL отображаются отображаемые определения таблиц, включая индексы. Также неплохо показать вывод 'EXPLAIN'. –
добавлено info @ O.Jones – Ray