簡體   English   中英

如何加快此SUM查詢?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM