order by是怎么工作的?(总结后超简洁版)

介绍

  排序的动作可能在内存中完成,内存放不下,则利用磁盘临时文件辅助排序。

  Mysql有两种排序算法,全字段排序 和 rowid排序

(1)全字段排序简单的说就是把所有要查询的字段都放在sort_buffer中, 对sort_buffer中的数据进行排序;

(2)rowid排序简单的说是把主键id和需要排序的字段放入sort_buffer中,排完序后,通过回表的方式拿到需要查询的字段。

全字段排序 VS rowid排序

  如果MySQL实在是担心排序内存太小,会影响排序效率,才会采用rowid排序算法,这样排序过

程中一次可以排序更多行,但是需要再回到原表去取数据。

  如果MySQL认为内存足够大,会优先选择全字段排序,把需要的字段都放到sort_buffer中,这

样排序后就会直接从内存里面返回查询结果了,不用再回到原表去取数据。

  这也就体现了MySQL的一个设计思想:如果内存够,就要多利用内存,尽量减少磁盘访问

对于InnoDB表来说,rowid排序会要求回表多造成磁盘读,因此不会被优先选择。

优化

  并不是所有的order by语句,都需要排序操作的。MySQL之所以需要生成临时表,并且在临时表上做排序操作,其原因是原来的数据都是无序的。如果能够保证取出来的行就是按照你order by后的字段排序好的话,那么就不需要临时表,也不需要排序了。可以通过联合索引或者覆盖索引的方式去优化。

posted @ 2023-01-14 15:45  JustJavaIt  阅读(44)  评论(0编辑  收藏  举报