Mysql(6)Group By优化

满足 GROUP BY 子句的最通用方法是扫描整个表并创建一个新的临时表,其中每个组的所有行都是连续的,然后使用此临时表来发现组并应用聚合函数(如果有)。 在某些情况下,MySQL 能够做得比这更好,并通过使用索引访问来避免创建临时表。

为 GROUP BY 使用索引的最重要的先决条件是所有 GROUP BY 列都引用来自同一索引的属性,并且索引按顺序存储其键(例如,对于 BTREE 索引)。 临时表的使用是否可以被索引访问替代还取决于查询中使用了索引的哪些部分、为这些部分指定的条件以及所选的聚合函数。

有两种方法可以通过索引访问来执行 GROUP BY 查询,如以下部分所述。 第一种方法将分组操作与所有范围谓词(如果有)一起应用。 第二种方法首先执行范围扫描,然后对结果元组进行分组。

Loose Index Scan(松散索引扫描)

处理 GROUP BY 的最有效方法是使用索引直接检索分组列。 通过这种访问方法,MySQL 使用了一些索引类型的属性,即键是有序的(例如,BTREE)。 此属性允许在索引中使用查找组,而不必考虑索引中满足所有 WHERE 条件的所有键。 这种访问方法只考虑索引中的一小部分键,因此称为松散索引扫描。 当没有 WHERE 子句时,Loose Index Scan 读取与组数一样多的键,这可能比所有键的数量小得多。 如果 WHERE 子句包含范围谓词,松散索引扫描会查找满足范围条件的每个组的第一个键,然后再次 读取尽可能少的键数。 这在以下条件下是可能的:

  • 查询针对单个表。
  • GROUP BY 只命名构成索引最左前缀的列,而不命名其他列。 (如果查询有 DISTINCT 子句而不是 GROUP BY,则所有不同的属性都引用构成索
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值