报错内容
### Error querying database. Cause: java.sql.SQLException: Out of sort memory, consider increasing server sort buffer size
### The error may exist in class path resource [mapper/ProjectCaseReportMapper.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: select pcr.id, pcr.finally_report_id,pcr.username,pcr.project_name,pcr.tag_name,pcr.status,pcr.exe_time,pcr.create_time, sc.case_title as caseName, sc.case_type as caseType, sc.case_num as caseNum from project_case_report pcr left join script_case sc on pcr.case_id = sc.id WHERE finally_report_id = 'df47149a698d4508b42593e778af8a08' order by pcr.create_time desc LIMIT 10
报错原因
在 order by 时 sort_buffer_size 超出MySQL默认大小
我的SQL会报这个错误是因为我的一个字段是json格式,而且它的内容大小比较大,导致查出了这个限制。出现这个问题的原因也通常是带有order by的语句中某个字段的数据量较大导致的,可以自行排查。
解决方法
网上有很多方法都是告诉我们如何修改这个限制值,具体修改它的方法自行查询吧,因为我不建议大家修改,出现这个问题说明我们的SQL不是很合适,应该想办法优化我们的SQL。下面是我的解决过程。
- 找到数据较大字段
- 优化SQL,初次 order by 查询时不查询该字段,先获取它的ID和其他信息
- 单独增加一个接口通过ID查询该字段
我将SQL重新编写,把导致问题的大字段放到单独的一个接口进行查询,这样可以加快首次 order by 查询接口的速度同时避免了不可预知的sort_buffer_size限制报错,也可以根据id快速查询大字段。