索引研究:(三)mysql中的排序算法 - filesort

MySQL在无法使用索引排序时,会使用内部的Filesort算法。此算法包括二次扫描和一次扫描两种方式,分别在内存和磁盘上进行数据排序。一次扫描算法效率高但内存消耗大,二次扫描则减少I/O但增加内存使用。优化查询以只获取所需列可以影响Filesort的选择,并影响性能。在连接操作排序时,如果ORDER BY只涉及第一个表,会显示'Using filesort'。了解并调整相关参数能提升查询性能。

索引研究:(三)mysql中的排序算法 - filesort

当mysql不能使用索引进行排序时,就会利用自己的排序算法(快速排序算法)在内存(sort buffer)中对数据进行排序;

如果内存装载不下,它会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合成有序的结果集(实际上就是外排序,使用临时表)。

对于filesort,mysql有两种排序算法:

二次扫描算法(two passes)

先将需要排序的字段和可以直接定位到相关行数据的指针信息取出,然后在设定的内存(通过参数 sort_buffer_size设定)中进行排序,完成排序之后再次通过行指针信息取出所需的Columns。

该算法是MySql 4.1之前采用的算法,他需要两次访问数据,尤其是第二次读取操作会造成大量的随机I/0操作。另一方面,内存开销较小。

一次扫描算法(single pass)

该算法一次性将所需的Columns全部取出,在内存中排序后直接将结果输出。

从MySql4.1版本中开始使用该算法。他见少了I/0次数,效率高,但是内存开销也较大。如果我们将并不需要的Columns也取出来,就会极大的浪费排序过程所需要的内存。

在MySql 4.1之后的版本,可以通过设置max_length_for_sort_data参数来控制MySql选择第一种排序算法还是第二种:当取出的所有大字段总大于max_length_for_sort_data的设置时,MySql就会选择使用第一种排序算法,反之则会使用第二种。

当对连接操作进行排序的时候,如果ORDER BY仅仅引用第一个表的列,MySql对该表进行filesort操作,然后进行连接处理,此时,EXPLAIN输出“Using filesort”;否则,MySql必须将查询的结果集生成一个临时表,在连接完成之后进行filesort操作,此时EXPLAIN输出“Using temporary;Using filesort”。

为了尽可能地提高排序性能,我们更加希望使用第二种排序算法,所以在Query中仅仅取出需要的Columns是非常有必要的。

资源介绍本次分享的资源是“基于Spring Boot开发的酒店管理系统”的毕业设计项目,附带详细的毕业论文及完整的源代码。这一资源不仅适用于即将毕业的学生进行毕业设计参考,也适合对Spring Boot开发有兴趣的开发者进行项目实践学习。该酒店管理系统采用了Spring Boot框架,结合了前端技术,实现了酒店的客户信息管理、房间管理、订单管理等功能。系统设计合理,代码结构清晰,易于理解与维护。通过该系统,用户可以轻松地进行酒店房间的预订、客户信息的录入与查询等操作,极大地提高了酒店管理的效率。此外,该系统还具备较高的可扩展性可定制性。源代码中包含了丰富的注释文档,方便开发者进行二次开发功能定制。无论是添加新的功能模块,还是调整现有功能的逻辑,都可以轻松地实现。毕业论文部分详细阐述了项目的背景、意义、设计思路、实现过程以及测试结果。通过阅读论文,读者可以深入了解该系统的设计理念、技术选型以及实现难点,为自己的毕业设计或项目开发提供有益的参考。总之,这份资源对于想要了解Spring Boot开发、进行酒店管理系统开发或进行毕业设计的同学来说,是一份不可多得的学习资料。它不仅能够帮助你快速掌握Spring Boot开发技能,还能够为你提供一个实际的项目案例,让你在实践中不断提升自己的编程能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值