MySQL教程-19-数据排序


MySQL教程-19-数据排序

文章插图
order bysql
#city为索引select city,name,age from zx where city='杭州' order by name limit 1000sort_buffer
Mysql进行排序的时候会分配每个线程分配一块内存用于排序
全字段排序过程
【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   内存   效率   它的   最大