mysql order by语句流程是怎么样的
order by流程是怎么样的
注意点:
select id, name,age,city from t1 where city='杭州' order by age limit 1000;
order by 和limit一般共同出现使用。他的流程是什么呢?
首先依然会走连接器,分析器,优化器选择索引。查看sql语句执行计划,一定要多使用explain sql语句。能发现很多事情。
排序避免全表扫描,我们排序字段需要尽可能有索引,explain sql语句由
Using filesort字段,代表需要使用排序。排序需要先读出数据,读出的数据需要在内存里面开辟一个空间来存数据。这块空间叫
sort_buffer,由参数sort_buffer_size控制。如果排序数据量过大。超过了自己sort_buffer空间的大小,怎么办?这是就会用额外的磁盘临时文件来辅助排序。这种情况下,性能就会非常低。通过查看 OPTIMIZER_TRACE 的结果来确认的,你可以从 number_of_tmp_files 中看到是否使用了临时文件。12代表使用了12个磁盘文件,这种外部排序一般使用归并排序算法。

sort_buffer空间的数据,每行长度也有限制,排序后查询的结果字段太多,就会存在放不下,这种情况下,mysql会使用rowid排序算法。这个算法在sort_buffer空间不用取出全部字段,只取排序字段age。排序后查询limit限制的100。然后根据主机id再去索引树上取得其他字段的值。
排序过程中需要排序这个过程,如果我们索引字段上排序,索引本来就有顺序,就不需要排序了。这样explain里面就没有user filesort关键字了。
排序流程:
- 初始化 sort_buffer,确定放入 name、city、age 这三个字段;
- 从索引 city 找到第一个满足 city='杭州’条件的主键 id,也就是图中的 ID_X;
- 到主键 id 索引取出整行,取 name、city、age 三个字段的值,存入 sort_buffer 中;
- 从索引 city 取下一个记录的主键 id;重复步骤 3、4 直到 city 的值不满足查询条件为止,对应的主键 id 也就是图中的 ID_Y;
- 对 sort_buffer 中的数据按照字段 name 做快速排序;按照排序结果取前 1000 行返回给客户端。

mysql order by语句流程是怎么样的的更多相关文章
- mysql ORDER BY语句 语法
mysql ORDER BY语句 语法 作用:用于对结果集进行排序. 语法:顺序:SELECT * from 表名 ORDER BY 排序的字段名 倒序:SELECT * from 表名 ORDER ...
- mysql group by语句流程是怎么样的
group by流程是怎么样的 注意点: select id%10 as m, count(*) as c from t1 group by m; group by是用于对数据进行分组,我们排序用到了 ...
- MySQL——优化ORDER BY语句
本篇文章我们将了解ORDER BY语句的优化,在此之前,你需要对索引有基本的了解,不了解的朋友们可以先看一下我之前写过的索引相关文章.现在让我们开始吧. MySQL中的两种排序方式 1.通过有序索引顺 ...
- Mysql常用sql语句(7)- order by 对查询结果进行排序
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 通过select出来的结果集是按表中的顺序来排序 ...
- Mysql 常用 SQL 语句集锦
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- mysql常用操作语句
mysql常用操作语句 1.mysql -u root -p 2.mysql -h localhost -u root -p database_name 2.列出数据库: 1.show datab ...
- Mysql 常用 SQL 语句集锦 转载(https://gold.xitu.io/post/584e7b298d6d81005456eb53)
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- MYSQL随机抽取查询 MySQL Order By Rand()效率问题
MYSQL随机抽取查询:MySQL Order By Rand()效率问题一直是开发人员的常见问题,俺们不是DBA,没有那么牛B,所只能慢慢研究咯,最近由于项目问题,需要大概研究了一下MYSQL的随机 ...
- 23个MySQL常用查询语句
23个MySQL常用查询语句 一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!> ...
随机推荐
- Nginx反向代理之巨坑underscores_in_headers
一.背景 因为项目需求,在做Windows的相关的事情:基本架构就是Nginx--> Nginx --> IIS,在Linux机器上通过Nginx做反向代理到Windows的IIS:然后遇 ...
- vue element-ui 组件上传图片 之后 对上传按钮 进行隐藏,删除之后重新显示
注:如果在当前的 vue 文件里 写了 style 样式,得 去除 scoped [私有属性必须去除,不能保留](这个是重点,不去除不生效), template 部分 <el-upload ...
- Flask(2)- 第一个 Flask Application
安装 flask Flask 是一个 Web 框架,使用它首先需要安装 pip3 install flask 导入 Flask 模块 import flask 最简单的一个栗子 主代码 from fl ...
- openswan发送状态机分析
openswan发送状态机分析 1. 函数调用关系 2. 函数说明 如果按用户空间.内核空间划分的话,此部分代码更多是运行在内核空间的. 2.1 ipsec_tunnel_init_devices() ...
- IPsec NAT-T说明和环境搭建
1. IPsec与NAT的关系 NAT作为一个IPV4的地址转换协议,它最初的目的是用来最解决IPv4地址不足的问题.通过NAT协议,局域网内的多个主机可以共同使用一个公网地址,这在很大程度上减轻了I ...
- SQL Server 使用bcp进行大数据量导出导入
转载:http://www.cnblogs.com/gaizai/archive/2010/04/17/1714389.html SQL Server的导出导入方式有: 在SQL Server中提供了 ...
- PyRevit开发第一步:获取Revit文档Document
1.安装PythonShell插件 PythonShell 2018 插件下载 交流QQ群: 17075104 新建项目后,运行功能Python Shell, 在弹出的窗口中复制或输入以下引用代码模块 ...
- ☕【JVM技术指南】「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"【下部】
承接上文 (完结撒花1-52系列)[JVM技术指南]「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"[上部] 并行收集器 并行收集器(也称为吞吐量收集器)是类似 ...
- golang sync.noCopy 类型 —— 初探 copylocks 与 empty struct
问题引入 学习golang(v1.16)的 WaitGroup 代码时,看到了一处奇怪的用法,见下方类型定义: type WaitGroup struct { noCopy noCopy ... } ...
- python工作中总结
以下方法平时很少用,用其它解决方法,只是总结了一些其它同事的技巧 1 如何自动生成列表,加一个条件还能筛选 [x for x in range(10) if x>5 ] 来生一个字典试试 d ...