MySQL优化篇:排序分组优化

33 篇文章 3 订阅
订阅专栏


where 条件和on的判断这些过滤条件,作为优先优化的部分,是要被先考虑的。其次,如果有分组和排序,那么也要考虑group by 和order by。

1、order by关键字排序优化

  • ORDER BY子句,尽量使用index方式排序,避免使用FileSort方式排序
  • 尽可能在索引列上完成排序操作,遵照索引建的最佳左前缀

1.1 无过滤不索引

create index idx_age_deptid_name on emp(age,deptid,name);
explain select * from emp where age=40 order by deptid;
explain select * from emp order by age,deptid;
explain select * from emp order age,deptid limit 10;

在这里插入图片描述

using filesort说明进行了手工排序。原因在于没有where 作为过滤条件!

结论:无过滤,不索引。where ,limit都相当于一种过滤条件,所以才能使用上索引。

1.2 顺序错,必排序

explain select * from emp where age=45 order by deptid,name;
explain select * from emp where age=45 order by name,deptid;
explain select * from emp where age=45 order by deptid,empno;

在这里插入图片描述

第二条SQL语句中,where两侧列的顺序可以变换,效果相同,但是order by 列的顺序不能随便变换。

第三条SQL语句中,empno字段并没有建立索引,因此也无法使用到索引,此字段需要排序

第四条SQL语句中,deptid作为过滤条件的字段,无法使用索引,因此排序没法用上索引

1.3 方向反,必排序

在这里插入图片描述

如果可以用上索引的字段都是用正序或者逆序,实际上是没有任何影响的,无非将结果集调换顺序。

在这里插入图片描述

如果排序的字段,顺序有差异,就需要将差异的部分,进行一次倒置顺序,因此还是需要手动排序。

1.4 索引的选择

(1)清除emp表上的所有索引,只保留主键索引

在这里插入图片描述

(2)执行以下查询语句

查询:年龄为30岁的,且员工编号小于101000的用户,按照用户名称排序

在这里插入图片描述

(3)全表扫描是不被允许的,需要进行优化

思路:首先需要让where 的过滤条件,用上索引,查询中,age,empno是查询的过滤条件,而name则是排序的字段,因此创建一个此三个字段的组合索引:

create index idx_age_empno_name on emp(age,empno,name);

在这里插入图片描述

再次查询,发现using filesort依然存在。

原因:empno是范围查询,因此导致了索引失效,所以name字段无法使用索引排序。

所以,三个字段的组合索引,没有意义,因为empno和name字段只能选择其一。

(4)解决办法:要么选择empno,要么选择name

在这里插入图片描述

两个索引同时存在,mysql会选择哪一个呢?执行上述SQL语句进行查看:

在这里插入图片描述

原因:所有的排序都是在条件过滤之后才执行的,所以如果条件过滤了大部分数据的话,几百几千条数据进行排序其实并不是很消耗性能,即使索引优化了排序但实际提升性能有限。相对的empno < 101000这个条件如果没有用到索引的话,要对几万条的数据进行扫描,这是非常消耗性能的,使用empno字段的范围查询,过滤性更好(empno从100000开始)

结论:当范围条件和group by 或者order by 的字段出现二选一的时候,优先观察条件字段的过滤数量,如果过滤的数量足够多,而需要排序的数据并不多时,优先把索引放在范围字段上。反之,亦然。

1.5 using filesort

(1)MySQL的排序算法

1)双路排序

MySQL 4.1 之前是使用双路排序,字面意思就是两次扫描磁盘,最终得到数据,读取行指针和 orderby 列,对他们进行排序,然后扫描已经排序好的列表,按照列表中的值重新从列表中读取对应的数据输出。

从磁盘取排序字段,在 buffer 进行排序,再从磁盘取其他字段。

简单来说,取一批数据,要对磁盘进行了两次扫描,众所周知,I\O 是很耗时的,所以在 mysql4.1 之后,出现了第二种改进的算法,就是单路排序。

2)单路排序

从磁盘读取查询需要的所有列,按照 order by 列在 buffer 对它们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据。并且把随机 IO 变成了顺序 IO,但是它会使用更多的空间,因为它把每一行都保存在内存中了。

3)单路排序存在的问题

由于单路是后出的,总体而言好过双路。但是存在以下问题:

在 sort_buffer 中,方法 B 比方法 A 要多占用很多空间,因为方法 B 是把所有字段都取出, 所以有可能取出的数据的总大小超出了 sort_buffer 的容量,导致每次只能取 sort_buffer 容量大小的数据,进行排序(创建 tmp 文件,多路合并),排完再取取 sort_buffer 容量大小,再排……从而多次 I/O。

结论:本来想省一次 I/O 操作,反而导致了大量的 I/O 操作,反而得不偿失

(2)优化策略

<1> 增大sort_buffer_size参数地设置

不管用哪种算法,提高这个参数都会提高效率,当然,要根据系统的能力去提高,因为这个参数是针对每个进程的 1M~8M 之间调整。

<2> 增大max_length_for_sort_data参数的设置

mysql 使用单路排序的前提是排序的字段大小要小于 max_length_for_sort_data。提高这个参数,会增加用改进算法的概率。但是如果设的太高,数据总容量超出 sort_buffer_size 的概率就增大,明显症状是高的磁盘 I/O 活动和低的处理器使用率。(1024-8192 之间调整)

<3> 减少select后面的查询的字段

Order by时使用select * 是一个大忌只Query需要的字段,这非常重要,在这里的影响如下

  • 当 Query 的字段大小总和小于 max_length_for_sort_data 而且排序字段不是 TEXT|BLOB 类型时,会用改进后的算法——单路排序, 否则用老算法——多路排序。

  • 两种算法的数据都有可能超出 sort_buffer 的容量,超出之后,会创建 tmp 文件进行合并排序,导致多次 I/O,但是用单路排序算法的风险会更大一些,所以要提高 sort_buffer_size。

1.6 使用覆盖索引

覆盖索引:SQL只需要通过索引就可以返回查询所需要的的数据,而不必通过二级索引查到主键后再去查询数据。

在这里插入图片描述

1.7 总结

为排序使用索引

  • MySQL两种排序方式:文件排序或者扫描有序索引排序
  • MySQL能为排序与查询使用相同的索引

假设建立组合索引KEY a_b_c(a,b,c)

order by 能使用索引最左前缀

  • order by a
  • order by a,b
  • order by a,b,c
  • order by a desc,b desc,c desc

如果WHERE使用索引的最左前缀定义为常量,则order by能使用索引

  • where a= const order by b,c
  • where a= const and b=const order by c
  • where a= const AND b> const order by b,c

不能使用索引进行排序的情况

  • order by a asc,b desc,c desc //排序顺序不一致
  • where g=const order by b,c //丢失a索引
  • where a= const order by c; //丢失b索引
  • where a=const order by a,d// d不是索引的一部分
  • where a in (……) order by b,c //对于排序来说,多个相等条件也是范围查询

2、GROUP BY关键字优化

  • group by 实质是==先排序后进行分组==,遵照索引建的最佳左前缀
  • 当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size的参数设置
  • where 高于having,能写在where限定的条件就不要去having限定

group by 使用索引的原则几乎跟order by一致,唯一区别是group by 即使没有过滤条件用到索引,也可以直接使用索引。

在这里插入图片描述

mysql调优-排序
特别剑的博客
03-29 1486
mysql调优-排序优化 第一章、mysql索引排序 文章目录mysql调优-排序优化mysql的两种排序方式方式A:filesort(文件排序)双路查找原理:单路查找原理方式B:index(索引排序)原理一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 mysql的两种排序方式 方式A:filesort(文件排序) 双路查找 原理: 单路查找 原理 方式B:index(索引排序) 原理 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,
MySQL排序优化
zsh2050的专栏
08-11 2594
MySQL有两种方式生成有序的结果:1.通过排序操作;2.按索引顺序扫描。
mysql优化排序分组优化
qq_1757537040的博客
03-12 1202
总结: order by子句需要配合limit子句才能让索引生效 如果涉及多个字段的排序,那么这些字段的排序方向一定要一致(要么都是升序,要么都是降序) 否则失效。 测试order by分组 测试排序方向的影响 1.单路排序和双路排序 如果order by排序的时候,索引生效就在内存中进行排序,如果索引不生效就只能文件中排序, 执行 filesort 又分两种不同情况: - 双路排序: - 特征:两批 I/O - 对应的 MySQL 版本:4.1 ...
MySQL深分页 + 多字段排序场景的优化方案【三百万级数据量】
Java知音
02-02 540
需求背景目前产品需要针对一个大范围地区内的所有用户做排行榜功能,且这个排行榜有几个比较蛋疼的附加需求:排行榜需要全量展示所有用户,且做分页展示(大坑????)排行榜有4种排序条件,且每个排序条件都是单独的。例如:用户的应用A下载数、应用B下载数、应用C下载数、应用D下载数(产品不期望把所有的数据整合成一块进行排名)历史代码背景其实这个需求已经够扯了,雪上加霜的是,以前的开发者在开发排行榜的时候,由于需求...
Mysql进阶优化篇05——子查询的优化排序优化
半旧518的博客
08-16 3042
子查询优化排序优化
MySQL优化篇:排序分组优化.pdf
04-18
主要包括order by关键字排序优化(无过滤不排序;顺序错,必排序;方向反,必排序;索引的选择;using filesort以及覆盖索引等内容)、group by关键字优化
Mysql索引优化解决方案.doc
03-07
MySQL优化中,Explain命令是一个非常有用的工具,它可以模拟优化器执行SQL查询语句,从而知道MYSQL是如何处理SQL语句的。通过Explain命令,可以知道SQL语句的执行计划,从而优化SQL语句,以达到最好的查询性能。 ...
MySQL利用索引优化ORDER BY排序语句的方法
01-19
创建表&创建索引 ...MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序分组操作。 通过索引优化来实现MySQL的ORDER BY语句优化: 1、ORDER BY的索引优化 如果一个SQL语句形如: SELECT
MySql索引优化
12-14
 第四,在使用分组排序子句进行数据检索时,同样可以显著减少查询中分组排序的时间。  第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。  索引的缺点:  第一,创建索引和...
MySQL数据库优化SQL篇PPT课件.pptx
10-07
MySQL数据库优化SQL篇PPT课件.pptx 本PPT课件主要讲述了MySQL数据库优化的重要知识点,特别是SQL优化方面的内容。从执行计划、SELECT语句、IN和EXIST语句、LIMIT语句、RAND函数、Order by、Group by、Distinct和...
mysql使用order by排序查询导致sql变慢
梧桐树的博客
10-16 8417
页面上显示大概也就两万多条数据,而且还进行了分页,按理说不应该这么慢,于是我把执行的sql拿出来,单独执行了一下,这一试发现了问题严重性,单单这一个sql的执行时间就得有二十多秒, 这个sql是进行了inner join关联查询的,查看两张表一张有5000多条数据,另一张有两万多条数据,这样算起下来笛卡尔积一下子数量一试相当庞大的,如果要是进行了全表扫描那可不得炸了。:由于索引不满足你的sql,mysql需要对数据行进行一次额外的排序操作,这个排序操作既费空间又费时间。
mysql多个字段排序徐_MySQL order by性能优化方法实例
weixin_36390615的博客
02-06 1251
前言工作过程中,各种业务需求在访问数据库的时候要求有order by排序。有时候不必要的或者不合理的排序操作很可能导致数据库系统崩溃。如何处理好order by排序呢?本文从原理以及优化层面介绍 order by 。一 MySQL中order by的原理1 利用索引的有序性获取有序数据当查询语句的 order BY 条件和查询的执行计划中所利用的 Index 的索引键(或前面几个索引键)完全一致,...
MYSQL慢SQL优化进阶--多表联查并排序
qq_43205267的博客
11-01 1845
MYSQL慢SQL优化进阶
【大数据技术】!重要!MySQL里按某字段指定内容顺序排序的几种实现方法
u011762522的博客
08-03 2489
【大数据技术】!重要!MySQL里按某字段指定内容顺序排序的几种实现方法
索引的顺序和字段的顺序不一致,也用不上索引。
weixin_34292402的博客
11-12 1178
mysql> desc test2; +----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+----...
Mysql]】数据分组&条件排序
weixin_47313201的博客
12-15 849
很实用的Mysql查询语句。 GROUP BY & ORDER BY (IF) 分组&条件排序 Mysql中 GROUP BY & ORDER BY 组合一起使用,先分组求和,在添加汇总行,同时对销售额进行降序排列,汇总行不参与排序,其中就涉及到了条件排序
Mysql调优你不知道这几点,就太可惜了
JAVA高级架构
05-04 497
一、Mysql的逻辑分层Mysql分为:连接层、服务层、引擎层、存储层。当客户端向服务端发起操作请求的时候,执行过程是这样的:1、客户端端与Mysql服务端的连接层建立连接,根据请求类型...
mysql高级篇索引优化
最新发布
09-06
MySQL高级篇索引优化主要涉及MySQL Query Optimizer(查询优化器)和索引的使用。MySQL Query Optimizer是MySQL中负责优化SELECT语句的模块,通过计算分析系统中收集到的统计信息,为客户端请求的Query提供最优的执行计划,即最优的数据检索方式。索引是帮助MySQL高效获取数据的数据结构,它可以提供排序和查询的功能。 在索引优化中,需要考虑以下情况适合建立索引: 1. 主键自动建立唯一索引。 2. 频繁作为查询条件的字段应该创建索引。 3. 查询中与其他表关联的字段,尤其是外键关系,应建立索引。 4. 单键或组合索引的选择问题,通常在高并发情况下倾向于创建组合索引。 5. 查询中排序的字段,通过索引进行访问可以大大提高排序速度。 6. 查询中用于统计或分组的字段。 而以下情况不适合建立索引: 1. Where条件中用不到的字段不需要创建索引。 2. 表记录太少,通常建议超过300万条记录再考虑建立索引。 3. 经常进行增删改操作的表,建立索引可以提高查询速度,但同时会降低更新表的速度。 4. 数据重复且分布平均的字段,对于包含许多重复内容的数据列,建立索引没有太大实际效果。 因此,在索引优化中,应该根据具体情况选择最经常查询和最经常排序的数据列来建立索引,避免对不需要的字段建立索引,以提高查询效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MySQL高级篇(SQL优化、索引优化、锁机制、主从复制)](https://blog.csdn.net/yuan2019035055/article/details/122310447)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • SpringBoot面试题(持续整理中……) 60092
  • JDK8:使用Optional进行变量判空、集合遍历 32468
  • 水平越权访问与垂直越权访问漏洞 31283
  • 使用oshi获取服务器的参数信息 7210
  • 性能指标:QPS、TPS、RT、吞吐量 6820

分类专栏

  • MySQL 33篇
  • 笔记
  • 前端 8篇
  • SpringBoot 9篇
  • Docker 5篇
  • ActiveMQ 6篇
  • Nginx 9篇
  • Mycat 4篇
  • ZooKeeper 4篇
  • 多线程 1篇
  • MyBatis 3篇
  • JVM 16篇
  • 职场知识 1篇
  • Scrum 19篇
  • 数据库 6篇
  • 数据中台 2篇
  • JAVA 48篇
  • 中台 3篇
  • Git 7篇
  • 面试知识 10篇
  • 段子 1篇
  • IntelliJ IDEA 1篇
  • 年终总结 2篇
  • 缓存 2篇
  • Linux 5篇
  • 自我反思 9篇
  • 硅谷产品实战 6篇
  • 技术演讲 4篇
  • 读书笔记 4篇
  • 性能优化 6篇
  • 项目管理 2篇
  • 个人成长 4篇
  • 极客新闻 21篇
  • 团队管理 13篇
  • Go语言 2篇
  • web安全 6篇

最新评论

  • MySQL优化篇:执行计划explain中key_len计算方式

    qq_36243228: 兄弟们,这写的对吗?

  • Java多线程:线程8锁案例分析

    Async.Thread: 用static修饰的方法怎么能用对象调用呢,不应该是用类调用吗

  • 使用oshi获取服务器的参数信息

    微凉128: 这不是搬砖 若依吗

  • JDK8:使用Optional进行变量判空、集合遍历

    0_虚无: optional还是不好用啊

  • SpringBoot面试题(持续整理中……)

    qqq2195819: 如何使用Spring Boot实现异常处理 这个是spring mvc 里面的,跟spring boot 没有关系

大家在看

  • GD32 MCU启动后如何运行到main函数
  • NXopen 二次开发 利用圆锥特征构造器 ConeBuilder圆锥体
  • MATLAB中的非线性规划 574
  • 如何在不降低网络安全防护的前提下,优化pcdn的流量清洗效率?
  • 如何使用Keil打开GD32 FPU及使用ARM DSP库 236

最新文章

  • 2021年2月反思与总结
  • React学习笔记7:React使用注意事项
  • React学习笔记6:React Hooks API总结
2021年9篇
2020年134篇
2019年121篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司大鹏网站搭建价格承德设计公司网站价格开封网站推广罗湖网站推广工具多少钱宣城网站建设哪家好沧州网站优化软件价格绥化外贸网站设计贺州模板制作多少钱东莞网站优化推广价格商洛网站搜索优化价格聊城网站优化推广推荐南宁SEO按天计费公司深圳网页制作报价外贸网站制作哪家好宜宾网页设计多少钱景德镇阿里店铺托管推荐临猗优化报价肇庆品牌网站设计公司宁波网页制作多少钱怒江百度网站优化公司海口百度竞价推荐莆田网络广告推广温州英文网站建设推荐鞍山网站制作设计多少钱昌吉网站优化按天收费陇南企业网站改版报价钦州优秀网站设计资阳推广网站报价漳州品牌网站设计报价和田营销网站报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化