MySQL是如何进行排序的,ORDER BY是如何执行的

MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。
假设找出在杭州居住的人,按名字排序前1000个人(假设city有索引,那么非常舒服,不用全表扫描)

select city,name,age from t where city='杭州' order by name limit 1000  ;

全字段排序

具体流程是,先按照索引把所有满足city='杭州’的数据的city、name、age字段都放到sort_buffer里(当然是一行一行扫描出来的),然后对sort_buffer中的数据进行排序,最后输出前1000个。
在这里插入图片描述

按 name 排序这个动作,可能在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和线程被分配用于排序的内存的大小sort_buffer_size。如果要排序的数据量小于 sort_buffer_size,排序就在内存中完成。但如果排序数据量太大,内存放不下,则不得不利用磁盘临时文件辅助排序。
在这里插入图片描述
number_of_tmp_files 代表用了12个外部临时文件辅助排序,外部排序一般使用归并排序算法。MySQL 将需要排序的数据分成 12 份,每一份单独排序后存在这些临时文件中。然后把这 12 个有序文件再合并成一个有序的大文件。
这里全部数据会被放到硬盘中,内存主要是用于计算排序过程和交互的
sort_mode 里面的 packed_additional_fields 的意思是,排序过程对字符串做了“紧凑”处理。即使 name 字段的定义是 varchar(16),在排序过程中还是要按照实际长度来分配空间的,也就是说杭州被分配的是2个字符。

rowid排序

只对原表的数据读了一遍,剩下的操作都是在 sort_buffer 和临时文件中执行的。但这个算法有一个问题,就是如果查询要返回的字段很多的话,那么 sort_buffer 里面要放的字段数太多,这样内存里能够同时放下的行数很少,要分成很多个临时文件,排序的性能会很差。
所以可以只把主键和要排序的name放到sort_buffer中(执行过程与全字段排序一样),只不过排序好后,多了一次主键索引查找结果。
在这里插入图片描述
辅助排序的文件少了,sort_mode也变了,因为参与排序的字段变了。最重要的是虽然扫描行数仍然是4000,但实际上参与排序过程要读5000行,因为按照排序索引还要查1000行再给出结果
在这里插入图片描述

如何选择?

MySQL 的一个设计思想:如果内存够,就要多利用内存,尽量减少磁盘访问,IO 是数据库中最昂贵的操作!!!!!,也就是说优先全字段排序,那么什么时候才会用rowid呢?
当单行数据长度超过该值,MySQL 就会觉得如果还用全字段排序,会导致 sort buffer 容纳下的行数太少,从而转为使用 rowId 排序。通过参数 max_length_for_sort_data 可以控制用于排序的行数据最大长度,默认值为 1024 字节。也就是说被select放到sort_buffer里的字段一行超过1024字节,就会用rowid排序。

如何回避高昂的排序成本

可以看到实际上排序是很高成本的操作,但其实并不是所有order by都要执行上述排序操作,因为这一切都是数据无序存储的锅,假设有一个 city 和 name 的联合索引,那么符合city的自动就已经是按name排好序的了


可以看到没有Using filesort了,也就是不用外部排序了。只扫描前1000条数据就够
在这里插入图片描述
再进一步,假设索引就能确定一条数据,而不用主键了,就会更快
在这里插入图片描述
在这里插入图片描述
但这并不是鼓励无脑建立索引,因为建立维护索引是有代价的,需要权衡

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

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

相关文章

测试问题---APP闪退

APP闪退的原因有以下几种: APP本身的程序错误或bug,导致在运行过程中出现异常或崩溃,例如内存泄漏、空指针、死循环等。这种情况下,需要开发者对APP进行调试和修复,或者用户更新到最新版本的APP。 APP与系统或其他APP…

U盘变成了.lnk,怎么处理

没曾想客户电脑是是不是有个病毒啥的,把我的U盘直接干成了只有一个.lnk的一个快捷方式,后面百度找了很多方法,最后找到了一个非常实用的方法,后整理了一下交给大家 方法如下: 1.找到电脑U盘文件 2.搜索框中输入你之…

解决yum源无法安装nginx问题以及简单部署nginx

问题: 我们在使用centos7时,软件安装nginx时大概都会出现无法获取包的情况。 解决办法: 添加nginx的下载源到yum源中 rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm如上图所示&a…

[SIGGRAPH2023-best]3D Gaussian Splatting for Real-Time Radiance Field Rendering

标题:3D Gaussian Splatting for Real-Time Radiance Field Rendering 链接:https://arxiv.org/pdf/2308.04079.pdf 本文提出了一种基于3D高斯体进行场景重建的方案,并提供了高效的渲染器实现。其重建精度,训练速度和推理速度均…

11111

#include <iostream> #include <vector> #include <queue> #include <algorithm>using namespace std;// 边的结构体 struct Edge {int src, dest, weight;// 按照权重进行排序bool operator<(const Edge& other) const {return weight < ot…

SDL2 播放音频(MP4)

1.简介 这里引入FFmpeg库&#xff0c;获取音频流数据&#xff0c;然后通过FFmpeg将视频流解码成pcm原始数据&#xff0c;再将pcm数据送入到SDL库中实现音频播放。 2.FFmpeg的操作流程 注册API&#xff1a;av_register_all()构建输入AVFormatContext上下文&#xff1a;avform…

在docker下安装suiteCRM

安装方法&#xff1a; docker-hub来源&#xff1a;https://hub.docker.com/r/bitnami/suitecrm curl -sSL https://raw.githubusercontent.com/bitnami/containers/main/bitnami/suitecrm/docker-compose.yml > docker-compose.yml//然后可以在docker-compose.yml文件里修…

人工智能赋能职业教育:技术融合引领教育变革

人工智能赋能职业教育&#xff1a;技术融合引领教育变革 摘要&#xff1a;本文探讨了人工智能技术在职业教育领域的应用及其带来的变革。通过分析人工智能在个性化教学、智能评估和教学资源优化等方面的技术优势&#xff0c;结合职业教育的现状和发展需求&#xff0c;提出了人…

Python爬虫进阶:提升爬虫效率

文章目录 一、单线程多任务异步协程二、线程池requests模块三、两个方法提升爬虫效率总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试…

【Cocos新手进阶】通过cocos实现可控制的动态加载更新的日志界面效果

本篇文章主要讲解&#xff0c;通过cocos实现可控制的动态加载更新的日志界面效果。 日期&#xff1a;2023年11月15日 作者&#xff1a;任聪聪 效果演示&#xff1a; 效果说明&#xff1a;在一个界面可以动态输出for循环的结果并更新到界面中进行不断加载的日志页面效果&#x…

windows版:TensorRT安装教程

查看版本对应cuda与TensorRT&#xff1a;https://blog.csdn.net/weixin_41540237/article/details/131589929 TensorRT 下载地址&#xff1a;https://developer.nvidia.com/nvidia-tensorrt-7x-download cudnn下载地址&#xff1a;https://developer.nvidia.com/rdp/cudnn-ar…

LVS负载均衡

LVS 概述 LVS是Linux Virtual Server的缩写&#xff0c;是一种基于Linux内核实现的高可用性、高性能的负载均衡技术。它可以将来自客户端的请求分发到多台服务器上&#xff0c;实现多台服务器的负载均衡&#xff0c;提高整个系统的性能和可用性。 LVS技术主要包括以下几个组件…

内网穿透工具NPS(保姆级教程)

前言&#xff1a; 有时候我们受限于硬件设备和网络的的问题&#xff0c;无法将内网的大容量、高性能存储设备或计算设备对外访问。这个时候就会变的特别苦恼&#xff0c;上云呢成本太大&#xff0c;不用云呢公网又无法直接访问&#xff0c;这个时候怎么办呢&#xff0c;NPS它来…

实时level2访问与策略研发

本周四下午4点&#xff0c;天软会聚焦“实时&level2访问与策略研发”开展我们的天软高频时序数仓会议&#xff0c;本次会议的报名客户&#xff0c;可以申请试用LEVEL-2数据测试账号哦~

泛微E9,独立选择框对应数据库表查询

泛微E9&#xff0c;独立选择框对应数据库表查询 文章目录 泛微E9&#xff0c;独立选择框对应数据库表查询步骤一&#xff1a;准备姓名、姓名文本字段&#xff1a;步骤二&#xff1a;获取选择框字段的id&#xff1a;其他 需求描述&#xff1a;假如流程表单有两个字段&#xff0c…

CSRF 跨站请求伪造漏洞理解

1.漏洞描述 跨站请求伪造是一种攻击&#xff0c;它强制浏览器客户端用户在当前对其进行身份验证后的Web应用程序上执行非本意的操作&#xff0c;攻击的重点在处于更改状态请求&#xff0c;而不是盗取数据&#xff0c;因为攻击者无法查看伪造请求的响应。 2.漏洞原理 攻击者可以…

深入探索 Django Channels

概要 随着 Web 应用的发展&#xff0c;实时功能如即时消息、实时通知等变得越来越重要。Django Channels 是 Django 的一个扩展&#xff0c;它使得在 Django 中构建实时功能变得可能。本文将深入探讨 Django Channels 的核心概念、架构以及如何实现一个实时应用。 1. Django C…

PLC电力载波通讯,一种新的IoT通讯技术

前言: PLC-IoT 是 PLC 技术应用在物联场景的创新实践,有效解决电力线路信号干扰、衰减问题,支持 IP 化通信能力,使能终端设备智能化,构建智慧边缘联接。PLC让传统IoT有了更多的连接可能: 电力线通信技术适用的场景包括电力配用电网络、城市智慧路灯、交通路口信号灯、园…

应用架构的演进 I 使用无服务器保证数据一致性

在微服务架构中&#xff0c;一个业务操作往往需要跨多个服务协作完成&#xff0c;包含了读取数据和更新多个服务的数据同时进行。在数据读取和写入的过程中&#xff0c;有一个服务失败了&#xff0c;势必会造成同进程其他服务数据不一致的问题。 亚马逊云科技开发者社区为开发者…

【Nginx】使用nginx进行反向代理与负载均衡

使用场景 反向代理&#xff1a;一个网站由许多服务器承载的&#xff0c;网站只暴露一个域名&#xff0c;那么这个域名指向一个代理服务器ip&#xff0c;然后由这台代理服务器转发请求到网站负载的多台服务器中的一台处理。这就需要用到Nginx的反向代理实现了 负载均衡&#xf…