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 Router的安装部署
Apr 24 MySQL
linux下导入、导出mysql数据库命令的实现方法
May 26 MySQL
正确使用MySQL update语句
May 26 MySQL
MySQL系列之十三 MySQL的复制
Jul 02 MySQL
解决MySQL Varchar 类型尾部空格的问题
Apr 06 MySQL
MySQL数据库事务的四大特性
Apr 20 MySQL
解决Mysql报错 Table 'mysql.user' doesn't exist
May 06 MySQL
MYSQL事务的隔离级别与MVCC
May 25 MySQL
MySQL导致索引失效的几种情况
Jun 25 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 MySQL
postgresql如何找到表中重复数据的行并删除
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
支持数组的ADDSLASHES的php函数
2010/02/16 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
Javascript - HTML的request类
2006/07/15 Javascript
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
详解angular用$sce服务来过滤HTML标签
2017/04/11 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
JS中的const命令你真懂它吗
2020/03/08 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
Swift中的协议(protocol)学习教程
2016/07/08 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
python查看矩阵的行列号以及维数方式
2020/05/22 Python
Python自动化操作实现图例绘制
2020/07/09 Python
Python 里最强的地图绘制神器
2021/03/01 Python
酒店led欢迎词
2014/01/09 职场文书
办公室主任主任岗位责任制
2014/02/11 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
小学生思想品德评语
2014/12/31 职场文书
公司租车协议书
2015/01/29 职场文书
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android