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 11 MySQL
如何用Navicat操作MySQL
May 12 MySQL
MySQL非空约束(not null)案例讲解
Aug 23 MySQL
MySQL空间数据存储及函数
Sep 25 MySQL
防止web项目中的SQL注入
Dec 06 MySQL
MySQL优化及索引解析
Mar 17 MySQL
排查并解决MySQL生产库内存使用率高的报警
Apr 11 MySQL
Golang连接并操作MySQL
Apr 14 MySQL
MySQL 条件查询的常用操作
Apr 28 MySQL
mysql如何查询连续记录
May 11 MySQL
Mysql表数据比较大情况下修改添加字段的方法实例
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
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
php 文章采集正则代码
2009/12/28 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
可以用来调试JavaScript错误的解决方案
2010/08/07 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
js格式化货币数据实现代码
2013/09/04 Javascript
js中function()使用方法
2013/12/24 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
快速学习AngularJs HTTP响应拦截器
2015/12/31 Javascript
js中的闭包学习心得
2018/02/06 Javascript
webpack之devtool详解
2018/02/10 Javascript
vue 点击按钮实现动态挂载子组件的方法
2018/09/07 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
JS实现电脑虚拟键盘的操作
2020/06/24 Javascript
Python实现多并发访问网站功能示例
2017/06/19 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
python生成1行四列全2矩阵的方法
2018/08/04 Python
如何使用Python标准库进行性能测试
2019/06/25 Python
python经典趣味24点游戏程序设计
2019/07/26 Python
Python流程控制 if else实现解析
2019/09/02 Python
Python识别处理照片中的条形码
2020/11/16 Python
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
精彩自我鉴定
2014/01/16 职场文书
行政工作个人的自我评价
2014/02/13 职场文书
生日礼品店创业计划书范文
2014/03/21 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL