大家好,我是小趴菜,在往常事务中,排序是一个十分常见的需求,可是有些时分,由于一些操作导致咱们排序的功率特别的低下,这时分咱们一般会给排序的字段增加索引来解决,除了给排序字段增加索引,咱们是否还有其它的优化手段呢?

order by原理

已然要优化,那么咱们就必须要理解order by的底层原理是怎样样的

select * from t_user where id > 10 order by age;
  • 1:MySql会依据where条件查询出一切符合条件的记载
  • 2:将查询的成果集放入sort_buffer中(排序内存)
  • 3:对中心成果集按照ORDER BY字段排序
  • 4:回表生成完好的成果集(假如需求)

以上便是咱们在执行上述SQL要执行的步骤,也是ORDER BY的实现原理,那么咱们要优化的当地有以下几点

优化点一:中心成果集

MySql首先会按照where条件查询出一切符合条件的记载,然后将成果集放入sort_buffer中,可是这里要注意的是,sort_buffer是有巨细限制的,假如你的中心成果集大于这个sort_buffer的巨细,那么这个中心集就不会放入内存中进行排序,而是放在硬盘中了。

咱们都知道在内存中排序比在硬盘中排序功率是高出特别多的,咱们能够运用 *show variables like ‘%sort_buffer_size%’;*来查看sort_buffer的巨细

order by除了加索引,咱们还能够怎样优化?

所以当你的内存足够大的时分,咱们能够恰当调大sort_buffer的巨细,让数据尽或许的在内存中排序,而不是进入到硬盘中

优化点二: 回表生成完好成果集

咱们看最后一步,假如需求ORDER BY需求回表生成成果集,什么是回表呢?便是拿到这条记载的主键ID,到主键索引中找到整条记载。

比如说,咱们一张表有一百多个字段,这时分咱们需求把这一百多个字段都查询出来的,那么这时分,中心成果集或许不会有一切的字段,而是排序字段+主键,举个比如,如下,假定咱们t_user表有一百多个字段

select * from t_user where id > 10 order by age;

这时分首先会按照where条件查询出中心成果集,可是这时分的中心成果集或许不会有一切的字段,而是只要age+id二个字段,等排序结束以后,再拿主键回表查询整条记载,所以就造成了回表。

当要查询的字段小于这个阈值的时分,中心成果集就把一切字段都查出来,后续也就不需求回表了。可是当大于这个阈值的时分,就需求回表了

order by除了加索引,咱们还能够怎样优化?

可是不能无脑的把这个值调大,来避免回表,还记得优化点一吗?? 假如你中心成果集太大,就不会在内存中进行排序,而是在硬盘中排序了。

总结

除了以上几点,咱们最好是能运用到掩盖索引,这样就不用生成中心成果会集,能够直接输出成果了。