Mysql中的双路排序和单路排序

news/2024/10/4 3:19:31

在Mysql中使用orderby进行排序的时候,是可以使用到索引排序的,但是需要添加一些限制条件,例如:
select * from t_user where name='张三' order by name;使用这种方式就可以使用到索引,同时使用limit也是可以使用到索引的
select * from t_user order by name;通过这种方式不会使用到索引

什么时候出现索引排序,什么时候出现文件排序:

  • 索引排序:当Mysql能够使用索引来执行查询并且可以利用索引中的信息来实现排序的时候,叫索引排序
  • 文件排序:当Mysql不能通过索引中的数据实现排序,叫文件排序

Mysql中的索引排序的流程:
select id,price from likes where price=199 order by price; sql 1
select id,name,price from likes where price =199 order by price; sql 2
这里存在两种情况,一种是存在覆盖索引的情况,如果存在覆盖索引(sql 1)就会通过索引进行排序之后直接返回,第二种情况是需要进行回表查询的情况(sql 2),需要先通过索引进行排序,排序完成之后通过id回表查询我们需要的数据。
 
 

我们要尽量使用索引排序,如果没有使用索引排序,mysql就是使用文件排序(filesort)
文件排序有两种:

  • 双路排序(回表排序模式):在执行的时候,会先根据条件将排序字段和主键id(定位行数据的字段)进行取出,然后放到sortbuff中(执行排序时分配的内存)进行排序,在排序完成之后需要通过主键id回表查询出其他我们需要的数据。
  • 单路排序:在执行的时候,会将我们需要的数据都加载到sortbuff中进行排序,排序完成之后,直接将内存中的数据直接返回,不需要在进行回表查询。

这里举一个例子:
select id,name,price from likes order by price;,我们在price列中创建了索引,但是因为没有条件限制,我们还是会走filesort的

当使用单路排序的时候:
这里我们需要的数据是 id、name、price,所以他就会将对应的这三列的数据放到sortbuff中,通过对price字段进行排序,排序完成之后,直接就将数据进行返回了。

当使用双路排序的时候:
尽管我们需要id、name、price,在排序的时候,也只会将id(定位行数据的字段,建立聚簇索引的字段),price字段(通过该字段进行排序)加载到sortbuff中,通过对price字段进行排序,排序完成之后,会将排序结果集中的id进行回表查询(因为我们还需要name字段),查询出我们需要的数据,在进行返回

双路排序和单路排序的优缺点:

  • 双路排序:因为双路排序需要继续两次访问数据,所以效率较慢
  • 单路排序:单路排序只需要访问数据一次就行了,所以效率较高,但是因为单路排序是将我们需要的数据都存储在内存中,所以可能会占用更多的内存。

注意下:当sortbuff不足的时候,mysql会使用磁盘用来辅助排序,这种情况在双路排序和单路排序中都可能发生,那是不是单路排序出现这种情况的次数会更多呢?其实不然,单路排序通常不会出现这种情况,为什么呢,这需要了解什么时候使用单路排序,什么时候使用双路排序。

双路排序和单路排序如何选择的:

在排序的时候,会首先判断是索引排序还是文件排序,如果是索引排序,就通过索引排序进行,如果是文件排序,首先需要判断我们需要的字段(例如上述例子中的id、name、price)的总大小是否超过max_length_for_srot_data,如果超过了就会使用双路排序,如果没有超过就会使用单路排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/29039.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

RocketMQ模型和生产实践

RocketMQ的客户端编程模型相对⽐较固定,基本都有⼀个固定的步骤。掌握这个固定步骤,对于学习其他复杂的消息模型也是很有帮助的。 消息⽣产者的固定步骤 1.创建消息⽣产者producer,并指定⽣产者组名 2.指定Nameserver地址,可以在代码中固定写IP,也可以通过配置项来写,最好…

Spring SpringMVC——前端控制器初始化过程

创建完DispatcherServlet对象时,会执行类中的init方法如果不配置 load-on-startup,那么 DispatcherServlet 将在第一次收到请求时才会被实例化和初始化。这意味着 DispatcherServlet 不会在服务器启动时立即执行创建和初始化的操作。当第一个请求到达时,Servlet 容器(如 To…

【VMware vSphere】存储提供程序中I/O 筛选器状态显示为脱机以及证书已到期的解决办法。

存储提供程序是由 VMware 提供或由第三方通过 vSphere APIs for Storage Awareness (VASA) 开发的软件组件。存储提供程序也可以称为 VASA 提供程序。存储提供程序可与包含外部物理存储和存储抽象的各种存储实体(例如 vSAN 和 Virtual Volumes)集成。存储提供程序也可以支持软…

服务器分层拓扑架构图形化显示工具

目录服务器分层拓扑架构图形化显示工具 --- HWLOC下载依赖包安装源码编译安装执行命令示例显示 PCI 层次结构参考文档服务器分层拓扑架构图形化显示工具 --- HWLOC可移植硬件局部 (hwloc) 软件包提供了现代架构分层拓扑的可移植抽象(跨操作系统、版本、体系结构等),包括 N…

流畅的python学习笔记

示例1-1 一摞有序的纸牌知识点:collections.namedtuple 构建了一个简单的类,表示单张纸牌。from collections import namedtuple Card = namedtuple(Card, [rank, suit])class FrenchDeck:ranks = [str(n) for n in range(2,11)] + list(JQKA)suits = spades diamonds clubs …

+63+条消息++狂神+docker+学习笔记_GaleTeng+的博客+-+CSDN+博客

+63+条消息++狂神+docker+学习笔记_GaleTeng+的博客+-+CSDN+博客 文章目录前言Docker 概述1.Docker 为什么会出现?2.Docker 历史3.Docker 能干嘛Docker 安装1. Docker 的基本组成2. 安装 Docker3. 阿里云镜像加速4. 回顾 HelloWorld 流程5. 底层原理Docker 常用命令1. 帮助命令…

GeometryCollection 的类型映射器(TypeHandler)

GeometryCollection 是 GeoJSON 数据模型中的一个类型,用于表示一个几何对象的集合。MySQL8 中支持了 GeometryCollection 类型,在对数据库和实体类进行对象映射时需要我们自己编写类型映射器来完成映射。java 本身不支持 GeometryCollection 类型,我们需要引入第三方包来获…

把.nuget文件夹从C盘移到其它盘

C盘是系统盘,考虑到很多程序都会占用系统盘资源,所以500G的固态硬盘究竟,一开始C盘就划了300G的大小。但即便这样,不知不觉中,C盘的空间也快不够用了。 分析了一下C盘的空间占用情况,发现.nuget文件夹大概有40多G的大小。这个不能忍,直接上网搜了一下移到其它盘的方法。…