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多平台发布

相关推荐
whn197711 分钟前
Gbase 8A密码有效期剩余天数检查
数据库
煎蛋学姐29 分钟前
SSM速到校园网上订餐网站5n2pv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·用户管理·校园订餐系统·ssm 框架
西岭千秋雪_31 分钟前
MySQL日志梳理(存储引擎层)
java·数据库·分布式·mysql·oracle
老华带你飞1 小时前
英语学习|基于Java英语学习系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端·学习
思成不止于此1 小时前
MySQL 查询基础(一):列选择、算数运算与别名使用
数据库·笔记·sql·学习·oracle
蟹至之1 小时前
【MySQL】索引 (下) —— 索引的类型、创建索引、删除索引
数据库·mysql·索引
一 乐1 小时前
校园社区系统|基于java+vue的校园悬赏任务平台系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
bing_1582 小时前
MongoDB中如下参数是什么含义
数据库·mongodb
一过菜只因2 小时前
MySql学习(2)
数据库·学习·mysql
Geoking.3 小时前
Redis 中 ziplist 与 quicklist 解析与对比
数据库·redis·缓存