博客
关于我
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 的存储引擎介绍
    查看>>
    MySQL 的存储引擎有哪些?为什么常用InnoDB?
    查看>>
    mysql 索引
    查看>>
    MySQL 索引失效的 15 种场景!
    查看>>
    MySQL 索引深入解析及优化策略
    查看>>
    MySQL 索引的面试题总结
    查看>>
    mysql 索引类型以及创建
    查看>>
    MySQL 索引连环问题,你能答对几个?
    查看>>
    Mysql 索引问题集锦
    查看>>
    Mysql 纵表转换为横表
    查看>>
    mysql 编译安装 window篇
    查看>>
    mysql 网络目录_联机目录数据库
    查看>>
    MySQL 聚簇索引&&二级索引&&辅助索引
    查看>>
    Mysql 脏页 脏读 脏数据
    查看>>
    mysql 自增id和UUID做主键性能分析,及最优方案
    查看>>
    Mysql 自定义函数
    查看>>
    mysql 行转列 列转行
    查看>>
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>