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后的字段排序好的话,那么就不需要临时表,也不需要排序了。可以通过联合索引或者覆盖索引的方式去优化。
希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt