博客
关于我
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_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
    查看>>
    mysql_real_connect 参数注意
    查看>>
    mysql_secure_installation初始化数据库报Access denied
    查看>>
    MySQL_西安11月销售昨日未上架的产品_20161212
    查看>>
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>
    MySQL、HBase 和 Elasticsearch:特点与区别详解
    查看>>
    MySQL、Redis高频面试题汇总
    查看>>
    MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
    查看>>
    mysql一个字段为空时使用另一个字段排序
    查看>>
    MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
    查看>>
    MYSQL一直显示正在启动
    查看>>
    MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
    查看>>
    MySQL万字总结!超详细!
    查看>>
    Mysql下载以及安装(新手入门,超详细)
    查看>>
    MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
    查看>>
    MySQL不同字符集及排序规则详解:业务场景下的最佳选
    查看>>
    Mysql不同官方版本对比
    查看>>
    MySQL与Informix数据库中的同义表创建:深入解析与比较
    查看>>
    mysql与mem_细说 MySQL 之 MEM_ROOT
    查看>>