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 慢查询日志深入理解
Apr 22 MySQL
MySQL 存储过程的优缺点分析
May 20 MySQL
MySQL 查询速度慢的原因
May 25 MySQL
Mysql systemctl start mysqld报错的问题解决
Jun 03 MySQL
MySQL数据库必备之条件查询语句
Oct 15 MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 MySQL
MySQL数据库查询进阶之多表查询详解
Apr 08 MySQL
MySQL GTID复制的具体使用
May 20 MySQL
MySQL数据库查询之多表查询总结
Aug 05 MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
Aug 14 MySQL
MySQL索引失效十种场景与优化方案
May 08 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
php 检查电子邮件函数(自写)
2014/01/16 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
php查询whois信息的方法
2015/06/08 PHP
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
2010/10/20 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
html+javascript+bootstrap实现层级多选框全层全选和多选功能
2017/03/09 Javascript
JS验证全角与半角及相互转化的介绍
2017/05/18 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
[01:21:07]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
Python中调用其他程序的方式详解
2019/08/06 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
IWOOT美国:新奇的小玩意
2018/04/27 全球购物
SQL SERVER面试资料
2013/03/30 面试题
EJB与JAVA BEAN的区别
2016/08/29 面试题
汽车销售求职自荐信
2013/10/01 职场文书
高一历史教学反思
2014/01/13 职场文书
生日派对邀请函
2014/01/13 职场文书
学生手册家长评语
2014/02/10 职场文书
springboot中一些比较常用的注解总结
2021/06/11 Java/Android
Python合并pdf文件的工具
2021/07/01 Python
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL