极客时间第6天打卡-order by 是怎么工作的?

2020-04-02  本文已影响0人  随手点灯

以前基本上没这个概念,现在看了mysql45讲大概明白了.

当我们写一条语句的时候,比如:

select name,age,sex from student where age = 12 order by name desc limit 10

首先mysql就是有一个参数,sort_buffer_size,是排序的内存

如果mysql认为你要查询的字段总长度不会太长的话,就会采用全字段进行排序.

我们一般会在age上面加上索引,那么操作流程就是:

首先从age的索引树上找到符合age条件的student主键id,然后会表,去主键索引上找到对应的数据,然后将name,age,sex存入到sort buffer的内存当中,然后进行排序,如果读进来的字段值没有超过sort_buffer_size,在内存中排序,如果超过了,就写到磁盘上的多个文件上,然后采用归并排序的方式进行排序.

排序当然是根据排序字段进行排序的,最后取排序后的前面10条.

如果mysql认为一行的总数据长度过大的话,就会采用rowid进行排序.

也就是回表的过程中,只会把排序字段和主键id读取到sort_buffer当中,然后进行排序,返回前面10条再一次回表返回需要的字段.

也就是说rowid排序比全字段排序多了一个步骤,最后的回表.性能自然就差一点.

有没有办法不排序直接读呢?

有,我们都知道,索引是排好序的,所以改造的方法就是创建一个联合索引 Idx_age_name(age,order)

这样的话,读取到的数据就是已经排序好的,就不需要再次进行排序了.

同时只要查询三个字段的话,我么可以用覆盖索引的方式来提升效率.

上一篇下一篇

猜你喜欢

热点阅读