iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL45讲之order工作原理 - flowers
  • 450
分享到

MySQL45讲之order工作原理 - flowers

MySQL45讲之order工作原理-flowers 2017-04-04 18:04:16 450人浏览 无得
摘要

本文介绍 order 的三种排序方式,全字段排序、rowid 排序和索引树排序,以及每种排序方式具体是如何工作的。 前言 本文介绍 order 的三种排序方式,全字段排序、rowid 排序和索

MySQL45讲之order工作原理 - flowers

本文介绍 order 的三种排序方式,全字段排序、rowid 排序和索引树排序,以及每种排序方式具体是如何工作的。

前言

本文介绍 order 的三种排序方式,全字段排序、rowid 排序和索引树排序,以及每种排序方式具体是如何工作的。

当使用 explain 查看执行计划时,如果 extra 中有 Using filesort,表示经过了排序。

Mysql 会在内存中分配一块内存专门用来排序,可以通过 sort_buffer_size 设置大小。如果需要排序的数据量小于 sort_buffer_size,排序在内存中进行,否则,需要采用 外部排序方法,即借助磁盘排序。

可以通过 OPTIMIZER_TRACE 的结果来查看是否使用了临时文件,


SET optimizer_trace="enabled=on"; 


SELECT * FROM `infORMation_schema`.`OPTIMIZER_TRACE`;

全字段排序

在 city 列已建立普通索引情况下,对于语句 select city,name,age from t where city="杭州" order by name limit 1000; 进行全字段排序流程是:

  1. 初始化 sort_buffer,确定放入 city,name,age 字段
  2. 遍历 city 索引树,找到第一个 city = "杭州" 的节点,拿到 id
  3. 根据 id 从主键索引树中拿到需要返回的字段值,放入 sort_buffer
  4. 循环执行 2,3 往后遍历,直到 city != "杭州",然后再执行后面流程
  5. 对 sort_buffer 中的数据按 name 排序
  6. 取出前 1000 行返回客户端

将要返回的字段全部放到 sort_buffer 进行排序,所以叫全字段排序。

这个算法有个缺点,如果要返回的字段很多,则一行数据的体积很大,这样很可能要用到外部排序,并且一个文件存下的行数有限,需要比较多的临时文件,临时文件一多,排序性能将十分低,所以这时 mysql 会采用 rowid 排序算法。

rowid排序

当返回的字段很多时,Mysql 将采用 rowid 排序算法。那字段很多的标准是如何界定的呢?MySQL 有一个参数 max_length_for_sort_data,当字段类型的总字节数大于 max_length_for_sort_data 时将采用 rowid 算法。比如,select city,name,age from t where city="杭州" order by name limit 1000; 中 city 和 name 字符串长度都是 16,age 占 4 字节,即总共 36 字节。

在 city 列已建立普通索引情况下,对于语句 select city,name,age from t where city="杭州" order by name limit 1000; 进行 rowid 排序流程是:

  1. 初始化 sort_buffer,确定放入 name, id 字段
  2. 遍历 city 索引树,找到第一个 city = "杭州" 的节点,拿到 id
  3. 根据 id 从主键索引树中拿到 name,id 字段值,放入 sort_buffer
  4. 循环执行 2,3 往后遍历,直到 city != "杭州",然后再执行后面流程
  5. 对 sort_buffer 中的数据按 name 排序
  6. 取出前 1000 行,按照 id 回到原表中取到 city,name,age 值再返回客户端

从上面流程可见,rowid 排序算法在 sort_buffer 中只放入了排序字段和 id,尽可能避免了外部排序低效的问题,但排序之后,还需要回表重新取一遍返回值的数据。

索引树排序

你或许会问,那有没有可以不排序的算法?

有的,就是索引树排序,因为字段值在索引树上已经有序,所以可以直接遍历索引树取到 id,然后到主键索引树拿返回值返回,不需要再排序。

那能不能直接从索引树中就拿到返回的数据,不要再回表呢?

当然也是可以的,这就是索引覆盖的思想,比如 select city,name,age from t where city="杭州" order by name limit 1000; 语句,只要建立联合索引 (city, name, age),就可以避免回表操作。

提问

假设你的表里面已经有了 city_name(city, name) 这个联合索引,然后你要查杭州和苏州两个城市中所有的市民的姓名,并且按名字排序,显示前 100 条记录。如果 SQL 查询语句是这么写的 :

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `city` varchar(16) NOT NULL,
  `name` varchar(16) NOT NULL,
  `age` int(11) NOT NULL,
  `addr` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `city` (`city`)
) ENGINE=InnoDB;

select * from t where city in ("杭州","苏州") order by name limit 100;

那么,这个语句执行的时候会有排序过程吗,为什么?

回答:会,因为 city_name 索引只能保证 city 相同的情况下,name 有序。而此时查询两个城市,那么显然不能保证按 name 有序。

如果业务端代码由你来开发,需要实现一个在数据库端不需要排序的方案,你会怎么实现呢?

回答:可以建立联合索引 (name, city) 来避免排序。

进一步地,如果有分页需求,要显示第101页,也就是说语句最后要改成 “limit 10000,100”, 你的实现方法又会是什么呢?

回答:

没有比较好的优化方法。首先看业务是否可以砍掉这个排序的需求,让用户只能一页一页翻,这样用户基本也就只会看前几页,就不需要考虑这个大分页情况了。为了意义不大的功能优化,可能会得不偿失。

如果实在需要,就可以先建立联合索引 (name, city),再通过下面的 SQL 查询。

SELECT * FROM t WHERE id IN ( SELECT id FROM t WHERE city IN ("杭州","苏州") ORDER BY name LIMIT 10000,100 ) AS tmp;

内查询直接索引覆盖,遍历 10100 个节点,拿到末尾的 100 个 id,不需要回表。再在外查询中,根据 id 从表中拿到数据返回客户端。这样,可以避免回表取 10100 次数据,如果符合的数据够 10100 条的话。

参考

  • [1] “orderby”是怎么工作的
您可能感兴趣的文档:

--结束END--

本文标题: MySQL45讲之order工作原理 - flowers

本文链接: https://www.lsjlt.com/news/8777.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • redux工作原理讲解及使用方法
    目录1. redux 是什么?2.redux的原理3. 如何使用 redux?(1).安装redux,创建redux文件夹,建立store.js(2).建立reducers.js(3...
    99+
    2024-04-02
  • UAV MOF工作原理之Agent注入机制原理
    一、前言MOF(Moniter Framwork)作为UAV应用数据捕获框架,不但实现了对应用无侵入的数据捕获,而且在框架层面实现了功能的灵活控制,并且保证了良好的可扩展性,在UAV中具有举足轻重的地位。MOF Agent注入机制作为UAV...
    99+
    2023-06-04
  • 详解Android JetPack之LiveData的工作原理
    目录前言 介绍 原理分析 前言 本篇文章主要讲解LiveData工作的原理,如果还不知道LiveData如何用的话,请参考官方文档。 LiveData的讲解涉及到了Lifecycl...
    99+
    2024-04-02
  • spark之pipeline的工作原理是什么
    Spark的Pipeline是一种用于将多个数据处理步骤串联起来形成一个完整的数据处理流程的机制。Pipeline的工作原理如下: ...
    99+
    2024-04-03
    spark pipeline
  • Mybatis工作原理
    作者:wuxinliulei链接:https://www.zhihu.com/question/25007334/answer/266187562来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。Mybatis原...
    99+
    2023-06-05
  • Java多线程揭秘之synchronized工作原理
    目录一.特性二.加锁过程(锁升级/锁膨胀)1.无锁状态2.偏向锁3.轻量级锁4.重量级锁5.总结三.锁优化1.锁消除2.锁粗化在学习本篇文章时,如果有不太懂的地方,大家也可以先看看博...
    99+
    2024-04-02
  • [转]EJB 工作原理
    前两天在这个版块的精华区里翻到了Robbin关于EJB的调用原理的分析,受益非浅,但感觉用纯文字来表达效果似乎不够直观,而且对RMI的阐述也略嫌少了些。这里我根据自己的一点体会,在Robbin帖子的基础上再来说说这个话题,供大家参考。首先,...
    99+
    2023-06-03
  • python pickle 工作原理
    picklehttp://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_WP.pdfhttps://blog.nelhage.com/2011/03/...
    99+
    2023-01-31
    工作原理 python pickle
  • jsonp的工作原理
    JavaScript是一种在Web开发中经常使用的前端动态脚本技术。在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。 这一策略对于JavaScript代码能够访问的页面内容做了...
    99+
    2023-09-01
    javascript ajax php
  • reactSuspense工作原理解析
    目录Suspense 基本应用Suspense 原理基本流程源码解读 - primary 组件源码解读 - 异常捕获源码解读 - 添加 promise 回调源码解读-Suspense...
    99+
    2024-04-02
  • Kubernetes API server工作原理
    作为Kubernetes的使用者,每天用得最多的命令就是kubectl XXX了。kubectl其实就是一个控制台,主要提供的功能: 提供Kubernetes集群管理的REST API接口,包括认证授权、数据校验以及集群状态变更; 提供其他...
    99+
    2023-06-04
  • Springboot工作原理详解
    目录 一、Spring Boot 1.1.Spring Boot 优点  二、SpringBoot 运行原理 1.1. pom.xml  2.2. 主启动类的配置 3.3. 主启动类的运行 三、自动配置原理 3.1、启动类上注解的作用  3...
    99+
    2023-10-10
    spring boot java spring
  • Android中SurfaceFlinger工作原理
    概念 SurfaceFlinger是一个系统服务,如:audioflinger,audiopolicyservice等等,系统的主要服务通过这个文章进行了解,Android的系统服务...
    99+
    2024-04-02
  • CSS hack的工作原理
    本篇内容主要讲解“CSS hack的工作原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS hack的工作原理”吧!CSS hack简介CSS hack由...
    99+
    2024-04-02
  • BeegoAutoRouter工作原理解析
    目录一、前言 二、从一个例子入手✨AutoRouter的解析规则:三、AutoRouter是如何工作的结语一、前言 Beego Web框架应该是国内Go语言社区第一个框架,个人觉得...
    99+
    2024-04-02
  • 详解MyBatis工作原理
    目录一、Mybatis工作原理二、Mybatis运行原理总结一、Mybatis工作原理 Mybatis分层框架图 Mybatis工作原理图 源码分析:一般都是从helloworl...
    99+
    2024-04-02
  • MySQL Mydumper的工作原理
    这篇文章主要讲解了“MySQL Mydumper的工作原理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL Mydumper的工作原理”吧! ...
    99+
    2024-04-02
  • vue-router的工作原理
    本篇内容主要讲解“vue-router的工作原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue-router的工作原理”吧!单页面应用的工作原理我理解的单...
    99+
    2024-04-02
  • 网闸的工作原理
    网闸GAP由固态读写开关和存储人质系统组成,其中固态开关的转换效率达到了纳秒级,存储介质通常采用scsi硬盘,因此GAP的性能得到了保证。 GAP连接在两个独立的网络系统中间,内网与外网永远不同时连接,在同一时刻只有一个网络与安全隔离网闸...
    99+
    2023-09-04
    服务器 网络 运维
  • 怎样理解HTTPS工作原理
    怎样理解HTTPS工作原理,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。当你打开浏览器,访问某个网站,如果网址旁有个小锁,代表访问的网址是安全的,反之不安全。当我们没有看到...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作