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入门命令之函数-单行函数-流程控制函数
Apr 05 MySQL
将图片保存到mysql数据库并展示在前端页面的实现代码
May 02 MySQL
MySQL连接查询你真的学会了吗?
Jun 02 MySQL
MySQL 时间类型的选择
Jun 05 MySQL
MySQL 1130异常,无法远程登录解决方案详解
Aug 23 MySQL
MySQL中的引号和反引号的区别与用法详解
Oct 24 MySQL
SQL语法CONSTRAINT约束操作详情
Jan 18 MySQL
MySQL创建定时任务
Jan 22 MySQL
MySQL 开窗函数
Feb 15 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
分享很少见很有用的SQL功能CORRESPONDING
Aug 05 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
php socket方式提交的post详解
2008/07/19 PHP
新手入门常用代码集锦
2007/01/11 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
JavaScript实现打开链接页面的方式汇总
2016/06/02 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
.vue文件 加scoped 样式不起作用的解决方法
2018/05/28 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
微信小程序实现的日期午别医生排班表功能示例
2019/01/09 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
深入理解javascript中的this
2021/02/08 Javascript
[45:56]Ti4正赛第一天 VG vs NEWBEE 3
2014/07/19 DOTA
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
从Python的源码浅要剖析Python的内存管理
2015/04/16 Python
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
2017/08/31 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
python实现根据文件格式分类
2019/10/31 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
Python-openCV开运算实例
2020/07/05 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
英国IT硬件供应商,定制游戏PC:Mesh Computers
2019/03/28 全球购物
英语专业毕业生求职简历的自我评价
2013/10/24 职场文书
成功的餐厅经营创业计划书
2014/01/15 职场文书
怎么写自荐书范文
2014/02/12 职场文书
会议室标语
2014/06/21 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
小学新教师个人总结
2015/02/05 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
学生安全责任协议书
2016/03/22 职场文书
react中的DOM操作实现
2021/06/30 Javascript