当前位置: 首页 > news >正文

MySQL如何实现数据排序

根据explain的执行计划来看,MySQL可以分为索引排序和filesort

索引排序

  • 如果查询中的order by字句包含的字段已经在索引中,且索引的排列顺序和order by子句一致,则可直接利用索引进行排序,由于索引有序,所以排序效率较高

filesort

  • 使用explain分析SQL执行计划的extra字段,如果字段值为using filesort时,则说明无法应用索引的顺序来排序

  • 如果排序的数据量较少,则会直接在内存sort_buffer完成排序,可通过sort_buffer_size参数来控制sort_buffer的大小(即排序的数据量小于sort_buffer_size);如果排序的数据量大于sort_buffer_size,则需要使用磁盘临时文件完成排序,性能较差

  • 内存排序又可分为双路排序和单路排序

双路排序

  • 如果select 列的数据长度超过 max_length_for_sort_data,MySQL则会采用row_id排序,即将row_id & 排序字段放置到 sort_buffer中排序
  • 举例:
select a,b,c from t1 where a="zhangsan" order by b;

假设单行记录超过 max_length_for_sort_data,为节省排序占用的空间,sort_buffer只会存储id和b来排序,排序后,再通过id回表查询得到a,b,c,最终将结果集返回给客户端
在这里插入图片描述

  • 如上排序的过程需要多个回表操作,等同于需要两次查询,也即双路排序(Two-Pass Sort)

单路排序

  • 如果select 列的数据没有超过 max_length_for_sort_data,则可以进行单路排序(Single-Pass Sort),即将selct 列的字段放到 sort_buffer中,排序后可直接得到结果集并返回给客户端,相比于双路排序,单路排序减少了回表操作,因此效率更高

磁盘文件临时排序

  • 当查询的数据量超过sort_buffer的大小,则需要利用磁盘文件进行外部排序,一般会使用归并排序,即将数据拆分为多个文件,单独对文件排序,其后再合并成一个有序的大文件(分而治之的思想)
  • 磁盘排序的效率较低,针对一些情况,可调大sort_buffer_size,以避免磁盘临时文件排序
http://www.lryc.cn/news/394240.html

相关文章:

  • 给我的 IM 系统加上监控两件套:【Prometheus + Grafana】
  • 【Python】基于动态规划和K聚类的彩色图片压缩算法
  • 【做一道算一道】和为 K 的子数组
  • Facebook应用开发:认证与授权登录流程详解
  • 实战:搭建一款属于自己的个人知识库~docusaurus(强大且丝滑)-2024.7.7(测试成功)
  • Java教程之IO模式精讲,NIO+BIO
  • 如何让代码兼容 Python 2 和 Python 3?Future 库助你一臂之力
  • AI让大龄程序员重新焕发活力
  • Python在现代办公自动化中的应用:会不会被裁?就看你的效率了!
  • Laravel5+mycat 报错 “Packets out of order”
  • 使用androidx.appcompat:appcompat:1.7.0无法运行的问题
  • 基于Java的水果商品销售网站
  • Redis 线程模型
  • 栈和队列---循环队列
  • 打卡第4天----链表
  • 07-7.1.1 查找的基本概念
  • 【数据结构与算法】快速排序双指针法
  • GESP C++一级真题
  • 短信验证码实现
  • pnpm的坑
  • 如何监控和分析 PostgreSQL 中的查询执行计划?
  • ruoyi-cloud登录接口实现滑块验证码
  • 三坐标测量机:柔性生产制造中的高精度测量解决方案
  • puppeteer 爬虫初探
  • Pandas 入门 15 题
  • 使用微信开发者工具连接gitee
  • 论文复现-基于决策树算法构建银行贷款审批预测模型(金融风控场景)
  • 力扣225题解析:使用队列实现栈的三种解法(Java实现)
  • 网络协议与标准
  • 154. 寻找旋转排序数组中的最小值 II(困难)