更新时间:2022-10-26 GMT+08:00

复杂查询造成磁盘满

场景描述

主机或只读实例偶尔出现磁盘占用高或磁盘占用满,其他只读实例或者备机磁盘空间占用正常。

原因分析

MySQL内部在执行复杂SQL时,会借助临时表进行分组(group by)、排序(order by)、去重(distinct)、Union等操作,当内存空间不够时,便会使用磁盘空间。

排查思路:

  1. 因为其他只读实例和备机磁盘占用空间正常,且是偶尔出现,说明该实例磁盘占用高,与承载的业务相关。
  2. 获取该实例的慢日志,分析磁盘占用高期间,是否有对应的慢SQL。
  3. 如果有慢SQL,执行explain [慢SQL语句],分析相应慢SQL语句。
  4. 观察explain语句输出的extra列,是否有using temporary、using filesort,如果有,说明该语句用到了临时表或临时文件,数据量大的情况下,会导致磁盘占用高。

解决方案

  1. 复杂查询语句导致磁盘打满,建议客户从业务侧优化响应查询语句,常见优化措施:
    • 加上合适的索引。
    • 在where条件中过滤更多的数据。
    • 重写SQL,优化执行计划。
    • 如果不得不使用临时表,那么一定要减少并发度。
  2. 临时规避措施:考虑业务侧优化复杂查询语句需要一定时间,可以通过临时扩容磁盘空间规避。