博客
关于我
Mysql group by
阅读量:797 次
发布时间:2023-02-10

本文共 1408 字,大约阅读时间需要 4 分钟。

MySQL GROUP BY 实现方式分析

GROUP BY 在 MySQL 中的实现方式有三种,其中两种会利用索引信息来完成 GROUP BY 操作,而第三种则不会。以下将详细分析这三种实现方式及其特点。


1. 松散索引扫描实现 GROUP BY

松散索引扫描是 GROUP BY 的一种高效实现方式。当 MySQL 完全利用索引扫描来实现 GROUP BY 时,无需扫描所有满足条件的索引键即可完成操作。

实现条件:

  • GROUP BY 条件字段必须符合索引的“最左前缀”原则。
  • 只能使用 MAX 和 MIN 这两个聚合函数。
  • 如果引用了该索引中 GROUP BY 条件之外的字段,必须以常量形式存在。

示例:

SELECT user_id, MAX(gmt_create) FROM group_messageWHERE group_id < 10GROUP BY group_id, user_id

在上述查询中,group_iduser_id 是索引 idx_gid_uid_gc 的前缀字段,因此可以通过松散索引扫描高效实现 GROUP BY。


2. 紧凑索引扫描实现 GROUP BY

紧凑索引扫描与松散索引扫描的主要区别在于,前者需要扫描所有满足条件的索引键,并根据读取的数据完成 GROUP BY 操作。

实现特点:

  • 执行计划中没有“Using index for group-by”信息,但索引仍然被用于完成 GROUP BY 操作。
  • 适用于 WHERE 条件为常量值的情况。

示例:

SELECT max(gmt_create) FROM group_messageWHERE group_id = 2GROUP BY user_id

在上述查询中,user_id 是索引 idx_group_message_gid_uid 的第二个字段,因此可以通过紧凑索引扫描高效实现 GROUP BY。


3. 临时表实现 GROUP BY

当 MySQL 无法通过索引完成 GROUP BY 操作时,会选择通过临时表和排序的方式来实现 GROUP BY。

实现过程:

  • 读取需要的数据。
  • 创建临时表。
  • 对临时表进行排序。
  • 根据临时表完成 GROUP BY 操作。
  • 示例:

    SELECT max(gmt_create) FROM group_messageWHERE group_id > 1 AND group_id < 10GROUP BY user_id

    在上述查询中,由于 group_id 不是常量条件,MySQL 无法通过索引完成 GROUP BY,因此选择了临时表实现。


    GROUP BY 的效率优化

  • 松散索引扫描

    • 适用于没有 WHERE 子句或 WHERE 子句为常量值的情况。
    • 读取的键值数量与分组组数量一致,效率较高。
  • 紧凑索引扫描

    • 适用于 WHERE 子句为常量值的情况。
    • 需要扫描所有满足条件的索引键,但可以避免额外排序操作。
  • 临时表实现

    • 适用于索引无法满足 GROUP BY 条件的情况。
    • 需要读取数据、创建临时表和排序,效率较低。

  • 总结

    在 MySQL 中,GROUP BY 的实现方式有三种,其中松散索引扫描和紧凑索引扫描是最常用的两种。选择哪种实现方式取决于查询的 WHERE 子句条件和索引的结构设计。通过合理设计索引,可以显著提升 GROUP BY 操作的效率。

    转载地址:http://lhffk.baihongyu.com/

    你可能感兴趣的文章
    MySQL事务隔离级别:读未提交、读已提交、可重复读和串行
    查看>>
    MySQL事务隔离级别:读未提交、读已提交、可重复读和串行
    查看>>
    webpack css文件处理
    查看>>
    mysql二进制包安装和遇到的问题
    查看>>
    MySql二进制日志的应用及恢復
    查看>>
    mysql互换表中两列数据方法
    查看>>
    mysql五补充部分:SQL逻辑查询语句执行顺序
    查看>>
    mysql交互式连接&非交互式连接
    查看>>
    MySQL什么情况下会导致索引失效
    查看>>
    Mysql什么时候建索引
    查看>>
    MySql从入门到精通
    查看>>
    MYSQL从入门到精通(一)
    查看>>
    MYSQL从入门到精通(二)
    查看>>
    mysql以下日期函数正确的_mysql 日期函数
    查看>>
    mysql以服务方式运行
    查看>>
    mysql优化--索引原理
    查看>>
    MySQL优化之BTree索引使用规则
    查看>>
    MySQL优化之推荐使用规范
    查看>>
    Webpack Critical CSS 提取与内联教程
    查看>>
    mysql优化概述(范式.索引.定位慢查询)
    查看>>