• 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博客专家

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

 


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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   一、引言  最近在公司做性能技术分享时,发现同事对环境搭建能力,还是有些欠缺。  或许,这也是大部分性能测试工程师所欠缺的技能。  因为绝大部分的性能测试工程师,要么是使用测试开发架构师搭建的性能平台,要么自己使用Jmeter工具进行压测。  并没有这对整个性能工程来进行平台的规划及搭建的能力。  这也是让从业多年的我有些困惑。  为了能让更多的性能测试工程师学会搭建性能平台,我们就来聊一聊Jmeter+InfluxDB+Grafana。  这里,我并没有把Promethues、k8s的监控服务纳入进来,  一来,怕给你造成混淆;  二来,后期会有专门的文章来介绍;  所以,这里就不做介绍...
            0 0 1103
            分享
          • 最近在阅读《高性能之道》这本书,其中有一个小标题让我突然想到一个旧话题:拓展自己的边界。弱化边界感。在我之前读过的技术类书籍中,往往更多偏重于不同团队之间的协作配合。而在这本书中我读到了更多关于个人成长方面的。如果你在在一个岗位工作时间变长之后,在经过稳定期之后就会遇到工作瓶颈。如何能突破这种瓶颈限制呢,作者提出一个方向:突破边界。# 拓展边界的重要性在IT工作中,拓展自己的边界绝对是非常重要的。作为一名互联网工作者,我们常常面对着快速发展的技术和变化的行业趋势。如果我们只停留在自己熟悉的领域,不积极主动地学习和尝试新的知识和技能,很可能会被时代抛在身后,错失许多机会。拓展自己的边界可以带来许...
            0 0 950
            分享
          •   新浪科技讯 北京时间4月26日早间消息,据报道,两位知情人士透露,Meta平台从微软挖来一名芯片高管Jean Boufarhat,负责为硬件设备开发定制芯片。  Boufarhat目前在微软担任硅工程公司副总裁,他将加入Meta的Facebook“敏捷硅团队”,他将取代Ofer shachham在Meta的职位。  后者大约一年前从加州搬到以色列,但在搬到以色列后仍继续管理团队。Shacham最近被告知他将被替换,目前还不清楚他的后续岗位安排。作者:佚名原文链接:新浪科技_新浪网(sina.com.cn)
            0 0 680
            分享
          •   应届生,没有实际项目经验怎么破?  面试的过程并不为为了显示面试官技术有多牛,也不是为了体现他们公司有多么难进而是考察你的能力和招聘需求是否相匹配,进而评估你能否满足工作需求,甚至实现更多的岗位期待。  弄清楚了这个核心,那么就只需要把控好两方面的内容:  1、自己的技能水平可以满足招聘需求  2、表达能力OK  围绕上面的核心,咱们来具体的聊一下:  首先来说,目前的行业招聘现状是:  ·测试行业底层在不断洗牌  · 初级人员薪资一直维持不变(相当于降薪)  · 已经不再是公司疯狂招人的阶段  所以就导致了明显的两极分化,大厂倾向于直接招测试开发,测试团队进一步精简,...
            0 0 923
            分享
          •   2022软件测试行业调查报告开始了,点击链接http://vote.51testing.com/ 填写问卷,五门测试实战课程任选两门免费学习。快来参加吧~  前言  这段时间共持续了四个月,总共投了 19 家公司,有几家挂在了不同的阶段,最后拿到了 8 家的 offer,这段时间里面了几十场面试,大多数面试的问题都懒得做记载了,在此记录一些大概的问题走向、一些面试常见的问题以及一丢丢面试技巧供大家参考。  一、四个月战况  投递统计(统计了一下,这四个月共向以下 19 个公司投递了简历,共拿了 8 个 offer)  一线大厂:字节、百度、腾讯、拼多多。  准一线大厂:华为、快手、美团、图...
            0 0 1343
            分享
      • 51testing软件测试圈微信