以前基本上没这个概念,现在看了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)
这样的话,读取到的数据就是已经排序好的,就不需要再次进行排序了.
同时只要查询三个字段的话,我么可以用覆盖索引的方式来提升效率.
网友评论