MySQL调优---文件排序(FileSort)详解

news2024/11/17 1:48:28

目录

产生

分类对比

产生情况

进行优化


  • 产生

  • 如果索引不能用于满足ORDER BY子句,MySQL将执行filesort读取表行并对它们进行排序的操作
  • 用Explain语句可以看到最后一列显示using filesort
  • EXPLAIN展示的执行计划的Extra这个字段中的“Using filesort”表示的就是需要额外的排序操作
  • MySQL会给每个线程分配一块内存用于排序,称为sort_buffer
  • 这里的filesort有可能是内存排序,也有可能是文件排序,但它们都统称filesort
  • 在内存中对数据进行排序,如果sort_buffer_size超过了需要排序的数据量的大小,表示排序可以直接在内存中完成
  • 那么文件排序又是什么意思呢?
  • 实际上如果需要排序的数据量太大,内存放不下,则不得不利用磁盘临时文件辅助排序
  • 文件排序就是所谓的外部排序
  • 所以说,MySQL的Order By的实现,就有可能利用到外部排序这种排序算法
  • 外部文件排序一般使用归并排序算法
  • MySQL将需要排序的数据分成N份,每一份单独排序后存在这些临时文件中,然后把这N个有序文件再一步步的合并成一个有序的大文件
  • 分类对比

  • filesort文件排序方式分为
  • 单路排序(全字段排序):
    • 是一次性取出满足条件行的所有字段,然后在sort buffer中进行排序
  • 举个例子,下面有一段sql:

  • 单路排序过程:
    • 从索引name找到第一个满足 name = ‘blblccc’ 条件的主键 id
    • 根据主键 id 取出整行,取出所有字段的值,存入sort_buffer(排序缓存)中
    • 从索引name找到下一个满足 name = ‘blblccc’ 条件的主键 id
    • 重复步骤 2、3 直到不满足 name = ‘blblccc’
    • 对 sort_buffer 中的数据按照字段 age 进行排序
    • 返回结果给客户端
  • 双路排序(又叫回表排序模式,rowid排序):
    • 是首先根据相应的条件取出相应的 排序字段 和可以直接定位行数据的行 ID,然后在 sort buffer 中进行排序,排序完后需要再次取回其它需要的字段
  • 双路排序过程:
    • 从索引 name 找到第一个满足 name = ‘blblccc’ 的主键id
    • 根据主键 id 取出整行,把排序字段 age 和主键 id 这两个字段放到sort buffer(排序缓存)中
    • 从索引 name 取下一个满足 name = ‘blblccc’ 记录的主键 id
    • 重复 3、4 直到不满足 name = ‘blblccc’
    • 对 sort_buffer 中的字段 age 和主键 id 按照字段 age进行排序
    • 遍历排序好的 id 和字段 age,按照 id 的值回到原表中取出所有字段的值返回给客户端
  • 对比两个排序模式:
    • 单路排序会把所有需要查询的字段都放到 sort buffer 中
    • 而双路排序只会把主键和需要排序的字段放到 sort buffer 中进行排序,然后再通过主键回到原表查询需要的字段
    • 单路排序占用内存大,但效率高,因为排好序后就已经是可以返回的结果了
    • 双路排序占用内存少,但效率要比单路排序低,因为排好序后还要回表加载数据
  • 产生情况

  • order by 字段不是索引字段
  • order by 字段是索引字段,但是 select 中没有使用覆盖索引,如:select * from staffs order by age asc;
  • order by 中同时存在 ASC 升序排序和 DESC 降序排序,如:select a, b from staffs order by a desc, b asc;
  • order by 多个字段排序时,不是按照索引顺序进行 order by,即不是按照最左前缀法则,如:select a, b from staffs order by b asc, a asc;
  • 进行优化

  • 什么时候使用单路/双路关键在于:
    • sort_buffer可供排序的内存缓冲区大小
    • max_length_for_sort_data 单行所有字段总和限制,超过这个大小启动双路排序
  • mysql内部是通过比较 max_length_for_sort_data(默认1024字节)这个系统变量跟需要排序的字段长度比较来判断采用哪种排序的
  • 如果需要排序的字段总长度小于max_length_for_sort_data,则采用单路排序
  • 如果需要排序的字段总长度大于max_length_for_sort_data,则采用双路排序
  • 如果 MySQL 排序内存 sort_buffer 配置的比较小并且没有条件继续增加了,可以适当把 max_length_for_sort_data 配置小点,让优化器选择使用 双路排序 算法,可以在 sort_buffer 中一次排序更多的行,只是需要再根据主键回到原表取数据
  • 如果 MySQL 排序内存有条件可以配置比较大,可以适当增大 max_length_for_sort_data 的值,让优化器优先选择单路排序,把需要的字段放到 sort_buffer 中,这样排序后就会直接从内存里返回查询结果了
  • 所以,MySQL通过 max_length_for_sort_data 和 sort_buffer 参数来控制排序,在不同场景使用不同的排序模式,从而提升排序效率
  • 注意,如果全部使用sort_buffer内存排序一般情况下效率会高于磁盘文件排序,但不能因为这个就随便增加

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

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

相关文章

DEV中TextEdit的keydown事件与click事件

DEV中TextEdit的keydown事件与click事件 gridview中加了一列textedit,并给其加了keydown事件,里面调用了另一个gridview1。 现在想给click事件也加上相同的功能,但是不管是复制相同的代码还是直接调用keydown事件,gridview1都调不…

django线上兼职平台系统-计算机毕设 附源码83320

django线上兼职平台系统 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对线上兼职等问题&am…

Steam客户端现在可以让你在Linux上启用硬件加速了

导读Valve最近发布了一个新的稳定的Steam客户端更新,大多数Linux玩家已经等待了很久,因为它最终让你在你的系统上启用硬件加速。 新的稳定的Steam客户端更新是一个重要的更新,带来了一个具有现代设计元素(对话框、菜单、字体和颜色…

脉冲雷达和相干检测

脉冲雷达的基本工作过程如下图所示 ​对于脉冲雷达来讲,只对信号的存在进行判断,得出的结果很简单:是否接收到回波信号,附带延时。 本文将重点讲解虚线框中的部分,也就是雷达信号的接收和检测,x(t)为接收端…

前端Vue自定义地址展示地址选择地址管理组件

前端Vue自定义地址展示地址选择地址管理组件&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13181 效果图如下&#xff1a; # cc-addressBox #### 使用方法 使用方法 <!-- addressItem&#xff1a;地址条目数据 c…

阿里云 搭建网站步骤

目录 1. 登录阿里云网站2. 购买服务器3. 获取服务器实例4.开放服务器端口(重点)5.传输项目到服务器(重点)6.更新apt工具和安装nginx(重点)7.配置nginx以及启动(重点) 1. 登录阿里云网站 阿里云网站 2. 购买服务器 3. 获取服务器实例 4.开放服务器端口(重点) 因为阿里云默认会…

java版 工程管理系统源码之Spring Cloud 工程项目各模块及其功能点清单

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中&#xff0c;管理不畅以及不良的项目执行&#xff0c;往往会导致项目延期、成本上升、回款拖后&#xff0c;最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统&#xff0c;确保…

【每日一题】1401. 圆和矩形是否有重叠

【每日一题】1401. 圆和矩形是否有重叠 1401. 圆和矩形是否有重叠题目描述解题思路 1401. 圆和矩形是否有重叠 题目描述 给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) &#xff0c;其中 (x1, y1) 是矩形左下角的坐标&#xff0…

【MySQL】使用LOAD DATA INFILE命令加载数据文件到MySQL数据库的方法和常见错误及解决方法

文章目录 【MySQL】使用LOAD DATA INFILE命令加载数据文件到MySQL数据库的方法和常见错误及解决方法LOAD DATA INFILE的语法详细1.创建&#xff08;选择&#xff09;目标数据库和表2.将数据从 CSV 文件导入已创建的表常见错误和解决方法错误1&#xff1a;ERROR 1290 (HY000): T…

人工智能 ---搜索算法

&#xff08;一&#xff09;Dijkstra-Prim 算法和 Kruskal 算法 Dijkstra-Prim算法基本思路&#xff1a;所有节点分成两个group&#xff0c;一个为已经选取的selected_node&#xff08;为list类型&#xff09;&#xff0c;一个为candidate_node&#xff0c;首先任取一个节点加入…

以太网通信的回环测试

PHY 芯片通常带有回环&#xff08;Loopback&#xff09;功能&#xff0c;用于 PHY 通信链路的测试。本文主要讨论三种常用 PHY 芯片的回环功能&#xff0c;并使用 Broadcom 的 B50612D 芯片进行 PHY 回环测试。 1 常见PHY芯片的回环功能 1.1 KSZ9031 KSZ9031 芯片支持以下两种…

坚鹏:中国农业银行BLM银行数字化转型战略培训在北京大学举办

中国农业银行BLM银行数字化转型战略培训班在北京大学顺利举办 中国农业银行成立于1951年&#xff0c;国家副部级单位。中国农业银行是中国金融体系的重要组成部分&#xff0c;提供各种公司银行、零售银行产品和服务&#xff0c;同时开展金融市场业务及资产管理业务&#xff0c…

Python中常见的10个高级特性解析

目录 1. 什么是Python中的装饰器&#xff1f;如何使用装饰器&#xff1f;2. 什么是Python中的迭代器和生成器&#xff1f;它们有什么区别&#xff1f;3. Python中的GIL是什么&#xff1f;它如何影响多线程应用程序&#xff1f;4. 什么是Python中的元类&#xff1f;如何使用元类…

小鱼C python - 集合的练习(去重、解密)

题一&#xff1a;用字典实现集合的去重特性 1. 生成100个1&#xff5e;100的随机值 思路&#xff1a; 1. range 范围 2. random.randint(a,b) import random x [] for I in range(100):x.append(random.randint(1,100)) print(x) 2. x和y的交集 思路&#xff1a;1.遍历x,…

Java经典面试题包含答案

文章目录 1.Java语言有哪些特点?2.面向对象和面向过程的区别&#xff1f;3.八种数据类型大小、封装类4.instanceof关键字的作用5.Java自动装箱与拆箱6. 重载与重写的区别7. 与 equals的区别8.hashCode的作用9. JVM vs JDK vs JRE10.什么是字节码&#xff1f;采用字节码的好处…

【MySql】RR 与 RC的本质区别

文章目录 当前读与快照读两个场景RR 与 RC的本质区别 本篇博客介绍的是RR与RC的本质区别&#xff0c;话不读说&#xff0c;直接进入主题即可。 当前读与快照读 select * from user lock in share mode ,以加共享锁方式进行读取&#xff0c;对应的就是当前读 不加lock in share…

【EXCEL】快速填充数据,批量提取与组合数据

目录 0.环境 1.简要介绍功能 2.具体实际应用 1&#xff09;提取括号中的内容 2&#xff09;拆分重组--重组“姓”和“职位” 3&#xff09;数据拆分 0.环境 windows office2021 注意&#xff1a;此功能可能需excel 2013版本及以上使用 1.简要介绍功能 在excel中&#xf…

flink datastream api实现数据实时写入hudi

Apache Hudi&#xff08;发音为“hoodie”&#xff09;是下一代流数据湖平台。 Apache Hudi 将核心仓库和数据库功能直接引入数据湖。 Hudi 提供表、事务、高效的更新插入/删除、高级索引、流式摄取服务、数据集群/压缩优化和并发性&#xff0c;同时将您的数据保持为开源文件格…

项目经理一直盲目跟风的PMP认证,到底还剩多少含金量?

早上好&#xff0c;我是老原。 到底有没有必要考证&#xff1f; 到底考啥证&#xff1f; PMP&#xff1f;软考&#xff1f;还是NPDP&#xff1f; …… 这是老原的粉丝们亘古不变的话题。 我这有不少朋友就是这样&#xff0c;前两年就在问我要不要考证&#xff0c;直到现在…

为什么你的手机号需要二次实名,这几个原因你想过没有?

尊敬的客户&#xff1a;您的手机卡存在安全风险&#xff0c;为保护您的权益&#xff0c;您的电话呼出、短信和流量使用功能被限制。请机主本人使用被保护的手机号码登录网页链接 进行实名核验&#xff0c;核验通过后&#xff0c;将自动恢复正常通信服务。如核验未通过&#xff…