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