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 12 MySQL
Mysql中 unique列插入重复值该怎么解决呢
May 26 MySQL
mysql外连接与内连接查询的不同之处
Jun 03 MySQL
浅谈MySQL 亿级数据分页的优化
Jun 15 MySQL
mysq启动失败问题及场景分析
Jul 15 MySQL
MySQL非空约束(not null)案例讲解
Aug 23 MySQL
MYSQL 运算符总结
Nov 11 MySQL
MySQL之select、distinct、limit的使用
Nov 11 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
mysql查询结果实现多列拼接查询
Apr 03 MySQL
提高系统的吞吐量解决数据库重复写入问题
Apr 23 MySQL
MySQL GTID复制的具体使用
May 20 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使用xmllint命令处理xml与html的方法
2014/12/15 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
Zend Framework数据库操作技巧总结
2017/02/18 PHP
PHP 实现base64编码文件上传出现问题详解
2020/09/01 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
Javascript验证上传图片大小[前台处理]
2014/07/18 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
jquery实现企业定位式导航效果
2018/01/01 jQuery
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
vue+axios实现post文件下载
2019/09/25 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
2021/01/13 Vue.js
Python 爬虫模拟登陆知乎
2016/09/23 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
Python实现Linux监控的方法
2019/05/16 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
Python 内存管理机制全面分析
2021/01/16 Python
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
.NET常见笔试题集
2012/12/01 面试题
营业经理岗位职责
2013/11/10 职场文书
会务接待方案
2014/02/27 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
学校百日安全活动总结
2015/05/07 职场文书
远程教育培训心得体会
2016/01/09 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
MySql存储过程之逻辑判断和条件控制
2021/05/26 MySQL
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers
Python Matplotlib库实现画局部图
2021/11/17 Python