【MySQL】聊聊order by 是如何排序的

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;

构建一个表结构,以及数据。 本篇主要来分析下order by是如何进行排序的。

EXPLAIN SELECT city,name,age FROM city_info WHERE city = '河北' order by name LIMIT 1000;

全字段排序

在这里插入图片描述
执行语句,发现使用了filesort,因为city有索引。所以整个city索引树就是如下,city 对应id主键。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
而图中按照sort_buffer 可能在内存或者外部排序使用,取决于排序所需的内存和参数sort_buffer_size 是MySQL为排序开辟的内存大小,如果排序的数据量小于 用内存,否则就用磁盘临时文件辅助排序。

rowid 排序

针对上面的执行流程,其实主要在临时文件进行排序,但是如何要排序的字段太多,那么sort_buffer中存储的数据就比较多。

SET max_length_for_sort_data = 16;

可以将排序的字段长度设置小一点,MySQL就采用另一个算法。

在这里插入图片描述
在这里插入图片描述
可以看到,如果字段太多的话,会先获取排序字段和id列,然后在最终返回结果的时候,进行处理。从主键id索引树获取对应的行。

全字段排序 VS rowid 排序

其实从这两种排序中可以看出,MySQL是能利用内存就多利用内存,减少外部磁盘的使用。另一个就是用不同的算法进行选择rowid排序或者全字段排序。

MySQL做排序成本还是比较高的,需要生成一个临时表,当然只是原数据是无序的。

如果name是天然有序的,那么就不需要进行file sort的排序操作。

alter table t add index city_user(city, name);

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

小结

本篇文章主要介绍order by 字段 在全字段和rowid排序的过程,针对不同的情况主要取决于要排序的字段长度,因此我们可以通过添加组合索引、覆盖索引进行优化file排序。

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

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

相关文章

springboot游戏售卖商城网站-计算机毕业设计源码80257

摘 要 本论文主要论述了如何使用JAVA语言开发一个springboot 游戏售卖商城网站,本系统将严格按照软件开发流程进行各个阶段的工作,采用springbootvue.js相结合框架,采用B/S架构,面向对象编程思想进行项目开发。在引言中&#xff0…

Stable Diffusion安装记录II

文章目录 前言0 更改python路径(跳过)1 Torch is not able to use GPU1.1 确认显卡1.2 安装nvdia驱动 1.3 检查CUDA1.4更改启动脚本 2 依赖安装2.1 pip install报错2.2 git报错2.3 卡在installing requirements 3 启动咯~3.1 clip报错 4 成功运行4.1 遗留…

高级Web Lab2

高级Web Lab2 12 1 按照“Lab 2 基础学习文档”文档完成实验步骤 实验截图: 2 添加了Web3D场景选择按钮,可以选择目标课程或者学习房间。

eNSP学习——连接RIP与OSPF网络、默认路由

目录 相关主要命令 实验一、连接RIP与OSPF网络 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建RIP和OSPF网络 3、配置双向路由引入 4、手工配置引入时的开销值 实验二、使用OSPF、RIP发布默认路由 原理介绍 实验目的 实验内容 实…

LeetCode 算法:盛最多水的容器c++

原题链接🔗:盛最多水的容器 难度:中等⭐️⭐️ 题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以…

回文串算法题

回文串是一个正着读和反着读顺序一样的字符串。"aba" 是回文串,"abba" 是回文串,"abc" 不是回文串。 回文串的题目,都要使用一个基本的逻辑,就是判断当前这个字符串是不是回文串。以 c 为例&#…

六一去哪儿,跟着蒙自源开启一段关于童年记忆与美味奇妙旅程

夏日微风轻拂,童心随风起舞。在这个充满欢声笑语的季节里,蒙自源诚挚地邀请您和您的家人,一同参加为六一儿童节精心准备的庆祝活动,共同开启一段关于童年记忆与美味的奇妙旅程。 从5月25日起,蒙自源的各大门店将化身为…

【R语言入门】 在Anaconda Navigator平台使用R语言编程

R语言入门 - 在Anaconda Navigator平台使用R语言编程 R Essentials - Using R Programming Language on Anaconda Navigator Platform By JacksonML 02/06/2024 1. 安装Anaconda Navigator 为了持续研究数据科学,笔者一开始就在电脑上安装了Jupyter Notebook&am…

services层和controller层

services层 我的理解,services层是编写逻辑代码语句最多的一个层,非常重要,在实际的项目中,负责调用Dao层中的mybatis,在我的项目中它调用的是这两个文件 举例代码如下 package com.example.sfdeliverysystem.servic…

详解 Spark 核心编程之累加器

累加器是分布式共享只写变量 一、累加器功能 ​ 累加器可以用来把 Executor 端的变量信息聚合到 Driver 端。在 Driver 程序中定义的变量,在 Executor 端的每个 Task 都会得到这个变量的一份新的副本,每个 task 更新这些副本的值后,传回 Dri…

LeetCode 两两交换链表中的节点

原题链接24. 两两交换链表中的节点 - 力扣(LeetCode) 思路,请看图片的过程模拟,这里添加了一个哨兵节点0,目的是为了方便操作,得到指向1节点的指针。 class Solution {public:ListNode* swapPairs(ListNod…

天润融通:大模型与生成式AI的融合,开辟零售增长新路径

大模型时代,零售消费企业如何用数智化出奇制胜。 近期,由国内领先的科技产业资本研究平台第一新声举办的“2024年中国CIO数字策略大会”在上海隆重举行。 天润融通消费零售行业顾问颜欣欣先生受邀参与此次大会,并发表了《大模型实践分享:基…

基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细

基于Nginx和Consul构建自动发现的Docker服务架构 文章目录 基于Nginx和Consul构建自动发现的Docker服务架构资源列表基础环境一、安装Docker1.1、Consul节点安装1.2、registrator节点安装 二、案例前知识点2.1、什么是Consul 三、基于Nginx和Consul构建自动发现的Docker服务架构…

智慧商砼搅拌车安监运营管理的创新实践

随着城市化进程的加速,商砼搅拌车作为城市建设的重要设备,其安全管理与运营效率直接关系到工程质量和施工进度。近年来,通过引入先进的4G无线视频智能车载终端套件,我们实现了对商砼搅拌车的高精度定位、实时音视频调度、实时油量…

Matlab2010安装注册+激活(保姆级教程)

目录 一、软件安装 二、软件激活 三、软件测试 Matlab2010压缩包: 链接:https://pan.baidu.com/s/1bX4weZ0nC-4zlDLUiSKcRQ?pwdxljj 提取码:xljj 一、软件安装 1.解压所给压缩包,目录双击setup.exe打开. (如果用户名为中文则会遇到这个…

virtualbox虚拟机、centos7安装增强工具

文章目录 1. virtualBox语言设置2. 设置终端启动快捷键3. 添加virtualbox 增强工具4. 设置共享文件夹 1. virtualBox语言设置 virtualbox -> file -> perferences -> language ->选择对应的语言 -> OK virtualbox -> 管理 -> 全局设定 -> 语言 -> …

Ubuntu server 24 (Linux) 普通用户不能sudo 也不能使用root登录 忘记root密码 修复解决方案

一 普通用户无法sudo,同时也没有其他用户可用 #test用户使用sudo报错,没有权限 testtest:~$ sudo vi /etc/sudoers [sudo] password for test: test is not in the sudoers file. 二 关闭ubuntu 服务器,重新开机 按下ESC 键 1 出现GRUB…

SAP跨服务器传输请求号

环境一、两台服务器并没有维护连接传输线路(DEV和QAS) 环境二、需要将外部公司服务器上的请求号传输到内部服务器中 方式:先从开发环境或服务器中下载请求号,再将请求号上传到目标服务器或环境中,在目标服务器使用ST…

JAVA流程控制do...while循环

1.对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次 2.do...while循环和while循环相似,不同的是,do...whlie循环至少会执行一次 do{ //代码语句 }while(…

yolov10/v8 loss详解

v10出了就想看看它的loss设计有什么不同,看下来由于v8和v10的loss部分基本一致就放一起了。 v10的论文笔记,还没看的可以看看,初步尝试耗时确实有提升 好记性不如烂笔头,还是得记录一下,以免忘了,废话结束…