[问题]MySql异常:Out of sort memory, consider increasing server sort buffer size(排序内存不足,考虑增加服务器排序缓冲区大小)

一、问题:

Out of sort memory, consider increasing server sort buffer size

排序内存不足,考虑增加服务器排序缓冲区大小

 

异常SQL DEMO:

SELECT `Id`,`APPROVAL_TYPE`,`APPROVAL_ID`,`APPROVAL_STAT`, `CreateTime` , `RequestJson`
FROM `APPROVAL` WHERE ( `IsDeleted` = FALSE )
ORDER BY `CreateTime` DESC LIMIT 0,50

 

二、解决方案:

  方案1:去掉不需要查询的字段,特别是数据大的字段。如上述的SQL,去掉“RequestJson”可以解决问题。

  方案2:【推    荐】给排序字段加索引。如上述SQL,可以给“CreateTime”加索引。同样可以解决问题。

  方案3:【不推荐】修改缓存区的大小

 

三、原因:

什么是排序缓存?

排序缓存是MySQL中的一个缓存区域,用于存储查询结果的排序数据。当执行一个带有ORDER BY的SQL时,MySQL会将结果存到排序缓存中,下次相同查询可以直接从缓存区读结果,而不需要再次进行排序,从而提高查询性能。

 

查看排序缓存大小:

 

show variables like 'sort_buffer_size'

 

修改缓存区大小

SET GLOBAL sort_buffer_size=1M

  

MySQL如何实现ORDER BY排序的?

1.解析SQL语句,生成解析树(Parse Ttrr)。解析时识别到ORDER BY子句,并将其添加到查询计划中。

2.如果ORDER BY子句中使用的列已经建立了索引,MySQL可能会利用这个索引来加速排序过程。避免了扫描全表,效率高。

3.如果没有碎银,MySQL会使用文件排序(File Sort)算法。

3.1.如果数据量不大,MySQL也可能直接在内存中对数据进行排序。性能高,单是受限于可用内存的大小
3.2.如果超过内存容量数据大,MySQL可能需要将数据写入临时文件中进行排序,这通常发生在内存不足以容纳所有需要排序的数据时。这种情况下,MySQL会使用磁盘临时文件来存储中间排序结果,这可能会显著影响性能。

posted @ 2024-12-24 14:16  chocolateXLL  阅读(1540)  评论(0)    收藏  举报