更新时间:2024-09-05 GMT+08:00
复杂查询造成磁盘满
场景描述
主机或只读节点偶尔出现磁盘占用高或磁盘占用满,其他只读节点磁盘空间占用正常。
原因分析
MySQL内部在执行复杂SQL时,会借助临时表进行分组(group by)、排序(order by)、去重(distinct)、Union等操作,当内存空间不够时,便会使用磁盘空间。
排查思路:
- 因为其他只读节点磁盘占用空间正常,且是偶尔出现,说明该实例磁盘占用高,与承载的业务相关。
- 获取该实例的慢日志,分析磁盘占用高期间,是否有对应的慢SQL。
- 如果有慢SQL,执行explain [慢SQL语句],分析相应慢SQL语句。
- 观察explain语句输出的extra列,是否有using temporary、using filesort,如果有,说明该语句用到了临时表或临时文件,数据量大的情况下,会导致磁盘占用高。
解决方案
- 复杂查询语句导致磁盘打满,建议客户从业务侧优化响应查询语句,常见优化措施:
- 加上合适的索引。
- 在where条件中过滤更多的数据。
- 重写SQL,优化执行计划。
- 如果不得不使用临时表,那么一定要减少并发度。
- 临时规避措施:考虑业务侧优化复杂查询语句需要一定时间,可以通过临时扩容磁盘空间规避。
父主题: 性能资源类