美文网首页
极客时间第6天打卡-order by 是怎么工作的?

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

作者: 随手点灯 | 来源:发表于2020-04-02 15:11 被阅读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)

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

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

    相关文章

      网友评论

          本文标题:极客时间第6天打卡-order by 是怎么工作的?

          本文链接:https://www.haomeiwen.com/subject/atuxphtx.html