[问题]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会使用磁盘临时文件来存储中间排序结果,这可能会显著影响性能。

浙公网安备 33010602011771号