• 1
  • 0
分享

接着上篇《深聊MySQL之:让orderby、Groupby查询速度飞起来(上)

我们今天继续讨论如何让orderby,groupby 的查询速度起飞 

3、order by 优化

我们了解了order by的原理,

那么我们就来看看,优化order by 有什么技巧。

3.1 添加合适索引

3.1.1 排序字段添加索引

①首先我们看下对 d 字段(没有索引)进行排序的执行计划:

explain select d,id from t1 order by d;

执行结果如下:

20201102174015873.png

发现使用的是 filesort(关注 Extra 字段)。

②再看些对 c 字段(有索引)进行排序的执行计划:

explain select c,id from t1 order by c;

执行结果如下:

20201102174130682.png

可以看到,根据有索引的字段排序,在 Extra 中显示的就为 Using index,表示使用的是索引排序。

注:

如果数据量比较大,显然通过有序索引直接返回有序数据效率更高

3.1.2 多个字段排序优化

问:有时面对的需求是要对多个字段进行排序,而这种情况应该怎么优化或者设计索引呢?

答:如果多个字段排序,可以在多个排序字段上添加联合索引来优化排序语句

举个例子

对 a、c 两个字段进行排序的执行计划

explain select id,a,c from t1 order by a,c;

执行结果如下: 20201102174423698.png

观察 Extra 字段,发现使用的是 filesort。

再看对 a、b(a、b 两个字段有联合索引)两个字段进行排序。

explain select id,a,b from t1 order by a,b;

执行结果如下:

20201102174516635.png

发现使用的是索引排序。 

注:

     多个字段排序的情况,如果要通过添加索引优化,得注意排序字段的顺序与联合索引中列的顺序要一致 

3.1.3 先等值查询再排序的优化

问:我们更多的情况是会先根据某个字段条件查出一部分数据,然后再排序,而这类 SQL 应该如果优化呢?

答:可以通过在条件字段和排序字段添加联合索引来优化此类排序语句。

举个例子

表 d1中,根据 a=1000 过滤数据再根据 d 字段排序的执行计划如下:

explain select id,a,d from t1 where a=1000 order by d;

执行结果如下: 20201102174839814.png

可以在 Extra 字段中看到 “Using filesort”,说明使用的是 filesort 排序。

再看下根据 a=1000 过滤数据在根据 b 字段排序的执行计划(a、b 两个字段有联合索引):

explain select id,a,b from t1 where a=1000 order by b;

执行结果如下:

2020110217492673.png

可以在 Extra 字段中看到“Using index”,说明使用的是索引排序。

3.2 去掉不必要的返回字段

有时,我们其实并不需要查询出所有字段,但是,有的时候,我们习惯性的写出 “select * from table_name”。 

举个例子

select * from t1 order by a,b;           /* 根据a和b字段排序查出所有字段的值 */

执行结果如下:

20201102175535957.png

select id,a,b from t1 order by a,b;      /* 根据a和b字段排序查出id,a,b字段的值 */

执行结果如下:

20201102175545498.png

通过这两个例子,我们可以看到,

查询所有字段的这条 SQL 是 filesort 排序,

而只查 id、a、b 三个字段的 SQL 是 index 排序。

那么,

为什么查询所有字段会不走索引?

是因为:

扫描整个索引并查找到没索引的行的成本比扫描全表的成本更高,所以优化器放弃使用索引。

3.3 修改参数

一、修改哪些参数?

这里就用到了在前面提到的两个参数:

    max_length_for_sort_data
    sort_buffer_size。

二、如何修改这两个参数的值?

・max_length_for_sort_data:

如果觉得排序效率比较低,可以适当加大 max_length_for_sort_data 的值,让优化器优先选择全字段排序。当然不能设置过大,可能会导致 CPU 利用率过低或者磁盘 I/O 过高;

・sort_buffer_size:

适当加大 sort_buffer_size 的值,尽可能让排序在内存中完成。但不能设置过大,可能导致数据库服务器 SWAP。

4、 group by 优化

默认情况,会对 group by 字段排序,

因此优化方式与 order by 基本一致,
如果目的只是分组而不用排序,可以指定 order by null 禁止排序

5、总结

今天,整理的是 order by 的 一些优化技巧,

因为在写sql中,这两个还是比较常用的,

所以,记住还是有必要的。

关于order by的优化,主要就这么几点知识:

・通过添加合适索引

・去掉不必要的返回字段

・调整参数:主要是 max_length_for_sort_data 和 sort_buffer_size

 

我是奕然

    51Testing认证讲师

    CSDN博客专家

关注我,带你学习更多更专业的测试开发知识。

 


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •        保证软件质量,是一个贯穿整个软件生存周期的重要问题。在早期,由于忽视了质量管理,导致软件项目管理的严重问题,以至于在软件开发中出现软件危机。重视软件质量管理,规范软件质量管理体系,对整个软件项目管理起到非常重用的促进作用。本文主要通过对管理策略的介绍,来达到提高软件质量的目的。       在软件开发团队中,由于质量被视为软件产品的生命。那么什么是软件质量?软件质量:与软件产品满足明确或隐含需求的能力有关的特征和特征的总和,它反映了三个方面的问题:       ...
            0 0 1092
            分享
          • 读者提问:部门例会上做测试分享不知道分享什么比较好,平时主要是做功能测试居多,阿常可以指点一下吗 ?阿常回答:1、所负责平台的业务梳理,业务流程分享;2、所负责平台的测试难点梳理,分享某个测试难点你是如何层层剖析的;3、所负责平台发现的复杂 BUG 梳理,分享某些复杂 BUG 你是如何发现的、定位 BUG 的过程是什么样的、最终开发是如何解决这些 BUG 的,以及今后如何规避再次出现此 BUG。4、所负责平台你自研了什么小工具,提升了测试效率,分享你的工具设计思路;5、所负责平台你采用了哪些第三方工具,提升了测试效率,分享你引入这些工具的思路;6、针对团队现状,你觉得可以引入某个新工具,跟团队...
            0 0 848
            分享
          •   前言  不知道大家在测试流程中把 “用例评审”放在了什么样的“地位”。在我看来,用例评审是测试流程中不可或缺的一环。于是打算把 我司的用例评审写下来,我们的用例评审是怎么做的,也希望汲取一些其他公司优秀的经验,相互学习下~  用例评审是什么  自我理解:用例写完了之后,不代表这份用例写的都是正确的,场景覆盖是全的,需要在多方人员进行查漏补缺,所以我的理解是:用例评审是产品、开发、测试一起对写好的用例进行一个review的过程。  如果用例都没有评审,直接去执行,可能会存在一些问题。  用例评审参会人员  产品、开发、测试。  详细一点的话,就是 制定该需求的产品,实现该产品的前端开发、后端...
            0 0 1210
            分享
          • 测试评估是通过收集质量保障活动过程产生的各类系统表现数据,利用策略进行分析,以进一观测经过全部质量活动后的质量风险,此次分析区别于测试报告,如性能测试报告、功能测试报告,测试报告是针对某项质量活动揭露有无问题的报告,测试评估是从风险程度去判断是否要增加质量活动。测试评估往往是质量保障人员最容易忽视的环节,但随着测试自动化程度水平的提升,测试人员往往只通过自动化报告去判断质量风险,而缺少必要的分析,极容易造成漏测。测试评估智能化通过将数据、算法、工程等相关技术有机结合,从质量活动系统表现数据、变更风险程度等方面,利用策略或算法预估项目准出的风险,以最终决定项目是否可以上线。测试评估的研究主要从风...
            0 0 615
            分享
          • 线上化、移动化的银行金融服务方兴未艾、持续深化,一个显著的标志就是手机银行成为银行领域金融科技发力的重点。整体页面文字的易读性、页面跳转的合理性、操作的便利性、功能响应的敏捷性、页面色彩和排版的美观性等,都是使用过程中用户视角下手机银行是否好用的评价对象。手机银行用户体验的重要性日益提升,但是目前体验性评价还存在方法、度量、标准上的一些不成熟之处。本文提出一种手机银行体验是否良好的量化评价方法,通过设置激励机制引导用户对手机银行的的业务模块或产品功能进行评分,支持对收集到的大量数据进行整体分析和分类分析,形成量化的用户体验评价指标,改善手机银行体验性测试中偏重于定性分析的现状。一、背景定量的体...
            0 0 1491
            分享
      • 51testing软件测试圈微信