MySQL 没有在带有 GROUP BY 查询的 SUM 中使用索引

标签 mysql performance indexing sum query-optimization

我刚刚创建了一个表:

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查询,即松散索引扫描和紧密索引扫描。但是,对于这两种扫描中的任何一种,需要注意的是,选择列表中使用的唯一聚合函数是 MINMAX。由于您选择的是 SUM,因此这些优化不可用。

使用索引可以使您的 WHERE 子句受益,因为这可能会让我们在查询计划的早期丢弃结果集中的记录。然而,为了计算每个组的总和,MySQL 必须接触剩余表中的每条记录。没有办法绕过这个来获得总和,因此我们如何访问所有这些记录并不重要。

关于MySQL 没有在带有 GROUP BY 查询的 SUM 中使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47904886/

相关文章:

apache - 默认的 Apache 索引页面参数

php - MYSQL 查询未正确显示数据

java - 无法在 java 中使用 executeQuery 发出数据操作语句

mysql - mysql中的表加密

ios - 在 tableView 中获取 Section indexPath 的行

sql - 在 Vertica 数据库内全局创建倒排索引

python - 如何在使用 Python 插入 MySQL 数据库后获取 "id"?

MongoDB 索引不帮助查询多键索引

performance - resource_stall.other可能意味着什么

Python - 如何有效地迭代字典的子集?