我刚刚创建了一个表:
CREATE TABLE `table_test` (
`time` date NOT NULL,
`line_id` char(36) NOT NULL,
`location_id` char(36) NOT NULL,
`placement_id` char(36) NOT NULL,
`flight_id` char(36) NOT NULL,
`impressions` int(11) DEFAULT `0`,
PRIMARY KEY (`time`,`line_id`,`location_id`,`placement_id`,`flight_id`),
KEY `table_test_IDX` (`time`,`placement_id`,`line_id`,`impressions`) USING
BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
然后当我尝试执行查询时:
SELECT
time,
placement_id,
line_id,
SUM(impressions) AS totalImpress
FROM
table_test
WHERE
time BETWEEN '2017-11-01' AND '2017-11-30'
GROUP BY time , placement_id , line_id;
它总是使用 Using where;使用临时的;使用 filesort
,在本例中,我希望查询使用 table_test_IDX
。
我在这里做错了什么?
非常感谢。
最佳答案
如果您仔细阅读 MySQL documentation对于聚合查询的优化,您会发现有两种方法可以优化GROUP BY
查询,即松散索引扫描和紧密索引扫描。但是,对于这两种扫描中的任何一种,需要注意的是,选择列表中使用的唯一聚合函数是 MIN
或 MAX
。由于您选择的是 SUM
,因此这些优化不可用。
使用索引可以使您的 WHERE
子句受益,因为这可能会让我们在查询计划的早期丢弃结果集中的记录。然而,为了计算每个组的总和,MySQL 必须接触剩余表中的每条记录。没有办法绕过这个来获得总和,因此我们如何访问所有这些记录并不重要。
关于MySQL 没有在带有 GROUP BY 查询的 SUM 中使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47904886/