MySQL 原理优化之Group By的优化技巧


Posted in MySQL onAugust 14, 2022
目录

今天来看看MySQL 中如何多Group By 语句进行优化的。

先创建tb_user 表如下:

MySQL 原理优化之Group By的优化技巧

通过show index from tb_user; 命令查看表,没有存在任何的索引。

MySQL 原理优化之Group By的优化技巧

执行如下代码,查看SQL 执行情况

explain select profession, count(*) from tb_user group by profession ;

MySQL 原理优化之Group By的优化技巧

发现返回结果中 type 为“ALL” ,Extra 返回“Using temporary” 说明没有使用索引。

于是,创建基于profession,age和status 的索引如下:

create index index_user_pro_age_sta on tb_user(profession ,age, status);

这里创建索引从左到右的顺序是 profession ,age, status。

此时再次执行SQL执行计划如下:

explain select profession, count(*) from tb_user group by profession ;

MySQL 原理优化之Group By的优化技巧

发现使用了索引“index_user_pro_age_sta”。说明在执行 group by操作的时候,使用联合索引是有效的。

接着在看使用如下代码:

explain select age, count(*) from tb_user group by age;

SQL 语句使用age 进行group by,查看explain的结果如下:

MySQL 原理优化之Group By的优化技巧

在Extra 字段中发现使用了“Using temporary”,说明没有走索引,是因为没有满足索引的最左前缀法则

联合索引 index_user_pro_age_sta的顺序从左到右分别是 profession ,age, status。

上面的SQL 语句Group by 后面接着的是age ,因此出现“Using temporary”。

这里对SQL 进行修改。如下:

explain select profession,age, count(*) from tb_user group by profession, age;

MySQL 原理优化之Group By的优化技巧

由于group by 后面跟着profession, age ,符合联合索引的创建顺序,因此索引生效。

我们再来试试再加入过滤条件的情况,加入profession = 软件工程,此时group by 里面只显示 age,那么此时是否会走索引, 答案是 using index。因为满足了最左前缀法则。

explain select age, count(*) from tb_user where profession = '软件工程' group by age;

MySQL 原理优化之Group By的优化技巧

总结一下:

SQL在分组操作的时候,可以通过索引来提高效率。做分组操作的时候,索引的使用需要满足最左前缀法则。

到此这篇关于MySQL 原理优化之Group By的优化技巧的文章就介绍到这了,更多相关MySQLGroup By优化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL数字类型自增的坑
May 07 MySQL
MySQL sql_mode修改不生效的原因及解决
May 07 MySQL
MySQL 可扩展设计的基本原则
May 14 MySQL
MySQL时间盲注的五种延时方法实现
May 18 MySQL
Mysql 用户权限管理实现
May 25 MySQL
MySQL单表千万级数据处理的思路分享
Jun 05 MySQL
MySQL表类型 存储引擎 的选择
Nov 11 MySQL
mysql自增长id用完了该怎么办
Feb 12 MySQL
Mysql Innodb存储引擎之索引与算法
Feb 15 MySQL
MySQL七大JOIN的具体使用
Feb 28 MySQL
MySQL中一条SQL查询语句是如何执行的
Apr 08 MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 MySQL
mysql函数之截取字符串的实现
Aug 14 #MySQL
MySQL 原理与优化之原数据锁的应用
MySql按时,天,周,月进行数据统计
Aug 14 #MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 #MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
Aug 14 #MySQL
MySQL数据库查询之多表查询总结
Aug 05 #MySQL
分享很少见很有用的SQL功能CORRESPONDING
Aug 05 #MySQL
You might like
一个用于网络的工具函数库
2006/10/09 PHP
注意:php5.4删除了session_unregister函数
2013/08/05 PHP
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
php递归调用删除数组空值元素的方法
2015/04/28 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
PHP中cookie知识点学习
2018/05/06 PHP
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
jQuery.getScript加载同域JS的代码
2012/02/13 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
Vue resource中的GET与POST请求的实例代码
2017/07/21 Javascript
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
[01:24:34]2014 DOTA2华西杯精英邀请赛5 24 DK VS LGD
2014/05/25 DOTA
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
python的random模块及加权随机算法的python实现方法
2017/01/04 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
python进行两个表格对比的方法
2018/06/27 Python
Python测试模块doctest使用解析
2019/08/10 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
理工学院学生自我鉴定
2014/02/23 职场文书
态度决定一切演讲稿
2014/05/20 职场文书
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
实习指导教师评语
2014/12/30 职场文书
文员岗位职责范本
2015/04/16 职场文书
暑期家教宣传单
2015/07/14 职场文书
中国梦宣传标语口号
2015/12/26 职场文书
浅谈python中的多态
2021/06/15 Python
python开发制作好看的时钟效果
2022/05/02 Python