Im使用下面的查询来计算每个公司排名前5的费用并对它们进行排序。目前该表有大约300万行,需要大约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有一个索引。
说明:
1 SIMPLE cost NULL ALL datetime NULL NULL NULL 3204715 50.00 Using where; Using temporary; Using filesort
CREATE
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'的输出也是一个好主意。 –
补充信息@ O.Jones – Ray