博客
关于我
Mysql group by
阅读量:796 次
发布时间: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中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中kill掉所有锁表的进程
    查看>>
    mysql中like % %模糊查询
    查看>>
    MySql中mvcc学习记录
    查看>>
    mysql中null和空字符串的区别与问题!
    查看>>
    MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
    查看>>
    MYSQL中TINYINT的取值范围
    查看>>
    MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
    查看>>
    Mysql中varchar类型数字排序不对踩坑记录
    查看>>
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    Mysql中各类锁的机制图文详细解析(全)
    查看>>