文章插图
order bysql
#city为索引select city,name,age from zx where city='杭州' order by name limit 1000
sort_bufferMysql进行排序的时候会分配每个线程分配一块内存用于排序
全字段排序过程
【MySQL教程-19-数据排序】
1.首先会根据要查找的字段初始化sort_buffer,放入city,name,age字段2.然后根据city索引找到所有满足city=‘杭州'的数据3.然后根据之前的查询结果,根据主键id取出需要的数据存入sort_buffer里面4.对sort_buffer中的数据按字段名name进行快速排序5.最后取前1000条返回结果集
分析从查询流程中我们知道,真正排序的过程其实就是第4步第4步,其实还涉及到内存和的问题#sort_buffer_size,就是MySQL为排序开辟的内存1.如果数据量不大,可以用sort_buffer完全存下,那么排序都在内存中进行2.如果数据量太大,sort_buffer存不下,就会利用磁盘的临时文件辅助排序
rowid排序这个排序是专门针对单行数据很大的情况的max_length_for_sort_data
排序单行数据最大长度,如果超过这个最大长度就会选用rowid进行排序
过程
1.初始化sort_buffer,放入主键id和需要排序的字段2.按照索引city,把满足条件主键id取得3.更具主键id取出整行数据,把id和name存入sort_buffer4.对sort_buffer里面的数据按照name排序5.最后根据排序结果,取出前1000行,并按照id取出city,name,age三个字段返回客户端
全字段 VS rowid其实观察rowid的排序过程,我们可以轻易的发现,数据查询的过程变的更麻烦了,但是排序都是在内存中进行的,这就是它的主要目的,如果涉及到磁盘的读写,效率损失的就更厉害了
MySQL的设计思想如果内存够用,就要多利用内存,尽量减少磁盘的访问为啥要排序?这就是排序的核心问题,因为查询出来的数据是无序的,所以我们要对数据排序,所以如果我们实现查询出来的数据就有序的话,可以直接避免上述的排序过程,这样的效率才是最高的
但是涉及到数据有序问题,那不避免的就是索引问题,索引也是需要成本的,所以这又是一场效率和成本的权衡问题,要对特定的问题,具体分析
关于索引,可以使用联合索引或者覆盖索引等办法
参考链接https://time.geekbang.org/column/article/73479
mysql-排序过程
标签:磁盘 sql mysq 临时 limit 内存 效率 它的 最大
- mysql:索引的本质详解
- mysql事务的隔离性等级事故
- mysql:索引之二叉树初步理解
- 布局篇 前端教程H5、CSS3怎么让文字内容都垂直居中?弹性布局
- mysql:数据库之删除记录对自动增长的影响
- 法国棍子面包,你做对了吗?详尽教程教您做正宗法棍!
- 怎么用PS做海报啊?
- mysql数据库中的sql语句——作业题讲解-2
- 产品倒影设计教程 电商美工photoshop设计视频教程 ps教学课程
- 折纸小教程:90后童年必备玩具,东南西北你还记得吗?