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 相关文章推荐
IDEA 链接Mysql数据库并执行查询操作的完整代码
May 20 MySQL
Mysql实现主从配置和多主多从配置
Jun 02 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
MySQL 如何限制一张表的记录数
Sep 14 MySQL
mysql5.7的安装及Navicate长久免费使用的实现过程
Nov 17 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
MySQL RC事务隔离的实现
Mar 31 MySQL
MySQL中IO问题的深入分析与优化
Apr 02 MySQL
MySQL数据库如何使用Shell进行连接
Apr 12 MySQL
Windows 64位 安装 mysql 8.0.28 图文教程
Apr 19 MySQL
MySQL范围查询优化的场景实例详解
Jun 10 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 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
apache php模块整合操作指南
2012/11/16 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
PHPExcel内存泄漏问题解决方法
2015/01/23 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
JavaScript 基础问答三
2008/12/03 Javascript
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
JS去除右边逗号的简单方法
2013/07/03 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
javascript几个易错点记录
2014/11/26 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
微信小程序开发实战教程之手势解锁
2016/11/18 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
bmob js-sdk 在vue中的使用教程
2018/01/21 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python3实现生成随机密码的方法
2014/08/23 Python
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
python装饰器常见使用方法分析
2019/06/26 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
string = null 和string = ''的区别
2013/04/28 面试题
药学专业大学生自荐信
2013/09/28 职场文书
职位说明书范文
2014/05/07 职场文书
酒店开业庆典策划方案
2014/05/28 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
德生BCL3000抢先使用感受和评价
2022/04/07 无线电