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 07 MySQL
MySQL复制问题的三个参数分析
Apr 07 MySQL
MySQL系列之十二 备份与恢复
Jul 02 MySQL
MySQL非空约束(not null)案例讲解
Aug 23 MySQL
MySQL8.0的WITH查询详情
Aug 30 MySQL
MySQL数据库必备之条件查询语句
Oct 15 MySQL
mysql sum(if())和count(if())的用法说明
Jan 18 MySQL
MySQL慢查询优化解决问题
Mar 17 MySQL
MySQL创建管理子分区
Apr 13 MySQL
MySQL 数据库范式化设计理论
Apr 22 MySQL
MySQL中正则表达式(REGEXP)使用详解
Jul 07 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开发规范手册之PHP代码规范详解
2011/01/13 PHP
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
php生成zip文件类实例
2015/04/07 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
Javascript操作cookie的函数代码
2012/10/03 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
微信小程序学习之数据处理详解
2017/07/05 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
zTree树形菜单交互选项卡效果的实现方法
2017/12/25 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
Python生成随机数组的方法小结
2017/04/15 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
Python日志模块logging基本用法分析
2018/08/23 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
接口的多继承会带来哪些问题
2015/08/17 面试题
大一期末自我鉴定
2013/12/13 职场文书
2014年工会工作总结
2014/11/12 职场文书
2015年预算员工作总结
2015/05/14 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书
南极大冒险观后感
2015/06/05 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
MySQL连接控制插件介绍
2021/09/25 MySQL