![](/img/trans.png)
[英]How can I speed up a slow SUM + ORDER BY + LIMIT query in MySQL?
[英]How can I speed this SUM query up?
即時通訊使用下面的查詢來計算每個公司的前5名費用並將其排序。 當前,該表大約有300萬行,大約需要8秒才能正確執行。 我正在尋找一種加快速度的方法。
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 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;
您的cost
表上(datetime, company, cost)
的復合索引可能會改善此查詢的性能。 值得一試,尤其是在cost
表中有很多其他列未參與此查詢的情況下。
注意查詢中的內容。
datetime BETWEEN '2016-10-01' AND '2016-12-01'
檢索值從2016年10月1日午夜到2016年12月1日午夜( 含)的所有行。 你可能想要
datetime >= '2016-01-01' AND datetime < '2016-12-01'
如果您要處理10月和11月的數據。 第二種配方在使用索引方面的效率不低於第一種配方。
您的查詢正在按公司計算結果,因此需要在公司列上建立索引。
ALTER TABLE cost ADD INDEX(company);
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.