如何加快此SUM查询的速度?

时间:2016-11-29 18:16:38

标签: mysql

我使用下面的查询计算每家公司的前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

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;

2 个答案:

答案 0 :(得分:1)

val myudf= sqlContext.udf .register("myudf", (name : String, thing: Array[String]) => new MyClass(name , thing)) cost表上的复合索引可能会提高此查询的效果。值得一试,特别是如果(datetime, company, cost)表中有许多其他列没有参与此查询。

请注意查询中的内容。

cost

检索2016年10月1日午夜至2016年12月1日午夜包含值的所有行。您可能需要

 datetime BETWEEN '2016-10-01' AND '2016-12-01'

如果您正在尝试处理10月和11月的数据。第二种配方在使用您的指数时效率不低于第一种配方。

答案 1 :(得分:1)

您的查询是按公司计算结果,因此需要公司列的索引。

ALTER TABLE cost ADD INDEX(company);

希望这有帮助。