我使用下面的查询计算每家公司的前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;
答案 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);
希望这有帮助。