MySQL分组优化

分组优化

在使用group by进行分组时,实际上也需要进行排序操作,与order by相比,group by主要是多了排序之后的分组操作

group by的实现有三种方式

  • 使用松散索引扫描实现group by

  • 使用紧凑索引扫描实现group by

使用松散索引扫描实现group by

MySQL完全利用索引扫描来实现group by

在使用explain执行计划时extra字段中出现using index for group by表示使用了松散索引扫描实现的group by操作

需要满足的条件

  • group by条件字段必须在同一个索引中最前面的连续位置
  • 在使用group by的同时,只能使用min和max这两个聚合函数
  • 如果用到了该索引中group by条件之外的字段条件时,必须以常量形式存在

使用紧凑索引扫描实现group by

紧凑索引与松散索引的区别主要在于需要在扫描索引的时候,读取所有满足条件的索引键,然后根据读取到的数据来完成group by操作得到相应的结果

MySQL会先尝试使用松散索引扫描实现group by,当发现条件不满足时,才会尝试使用紧凑索引扫描

当group by条件字段并不连续或者不是索引前缀部分的时候,无法使用松散索引扫描,才会尝试使用紧凑索引扫描来实现

使用临时表实现group by

MySQL在进行group by操作的时候要想利用索引,必须满足group by的字段必须同时存放于同一个索引,且该索引是一个有序索引,如果无法找到合适的索引可以利用的时候,就不得不先读取需要的数据,然后通过临时表来完成group by操作

zhhll.icu/2021/数据库/关系...

本文由mdnice多平台发布

相关推荐
b***46248 小时前
从 SQL 语句到数据库操作
数据库·sql·oracle
Q***f6358 小时前
后端数据库性能优化的8个工具推荐
数据库·性能优化
一水鉴天9 小时前
整体设计 定稿 之1 devOps 中台的 结论性表述(豆包助手)
服务器·数据库·人工智能
q***07149 小时前
Spring Boot 中使用 @Transactional 注解配置事务管理
数据库·spring boot·sql
m***92389 小时前
【SQL】MySQL中的字符串处理函数:concat 函数拼接字符串,COALESCE函数处理NULL字符串
数据库·sql·mysql
!停10 小时前
VS实用调试技巧
数据库
8***235510 小时前
在Django中安装、配置、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的功能
数据库·django·sqlite
Token_w11 小时前
openGauss:全密态数据库的金融级安全实践
数据库·安全·金融
合作小小程序员小小店12 小时前
图书管理系统,基于winform+sql sever,开发语言c#,数据库mysql
开发语言·数据库·sql·microsoft·c#
ss27312 小时前
020:共享锁深度解析:从AQS原理到高并发实践
数据库·redis·缓存