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 相关文章推荐
Windows10下安装MySQL8
Apr 06 MySQL
MySQL索引知识的一些小妙招总结
May 10 MySQL
详解MySQL的Seconds_Behind_Master
May 18 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
解决Mysql的left join无效及使用的注意事项说明
Jul 01 MySQL
MySQL系列之八 MySQL服务器变量
Jul 02 MySQL
MySQL分库分表详情
Sep 25 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
mysql 生成连续日期及变量赋值
Mar 20 MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
Jun 14 MySQL
MySQL事务的隔离级别详情
Jul 15 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数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
javascript 写类方式之十
2009/07/05 Javascript
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
Node.js + express基本用法教程
2019/03/14 Javascript
vue的滚动条插件实现代码
2019/09/07 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
JavaScript实现点击切换功能
2021/01/27 Javascript
js实现简单的倒计时
2021/01/28 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
党员违纪检讨书
2014/02/18 职场文书
优秀经理获奖感言
2014/03/04 职场文书
法人身份证明书
2014/10/08 职场文书
信息合作协议书
2014/10/09 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
简述python四种分词工具,盘点哪个更好用?
2021/04/13 Python
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers
Java中生成微信小程序太阳码的实现方案
2022/06/01 Java/Android