
# RDS for MySQL慢SQL问题处理
在相同业务场景下，架构设计和库表索引设计会影响查询性能，良好的设计可以提高查询性能，反之会出现很多慢SQL（执行时间很长的SQL语句）。本文介绍导致慢SQL的原因和解决方案。
#### SQL异常
- 原因及现象 SQL异常的原因很多，例如库表结构设计不合理、索引缺失、扫描行数太多等。
  您可以在控制台的慢日志页面，下载并查看执行缓慢的SQL，慢SQL的执行耗时等信息。具体操作，请参见[管理慢日志](https://support.huaweicloud.com/usermanual-rds-mysql/rds_mysql_slow_query_log.html)。
  
- 解决方案 根据实际业务情况优化SQL。
  
 
#### 实例瓶颈
- 原因及现象 实例到达瓶颈的原因一般有如下几种：
  - 业务量持续增长而没有扩容。
  
  - 硬件老化，性能有损耗。
  
  - 数据量一直增加，数据结构也有变化，导致原来不慢的SQL变成慢SQL。
  
  
  您可以在控制台的查看实例的资源使用情况。如果资源使用率各项指标都接近100%，可能是实例到达了瓶颈。具体操作，请参见[查看实例性能指标](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0027.html)。
  
- 解决方案 确认实例到达瓶颈后，建议升级实例规格。具体操作，请参见[手动变更实例的CPU和内存规格](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_topic_scale_rds.html)。
  
 
#### 版本升级
- 原因及现象 实例升级版本可能会导致SQL执行计划发生改变，执行计划中连接类型从好到坏的顺序是system\>const\>eq_ref\>ref\>fulltext\>ref_or_null\>index_merge\>unique_subquery\>index_subquery\>range\>index\>all。更多信息，请参见[MySQL官方文档](https://dev.mysql.com/doc/refman/5.6/en/explain-output.html#explain-join-types)。
  range和index连接类型时，如果SQL请求变慢，业务又不断重发请求，导致并行SQL查询比较多，会导致应用线程释放变慢，最终连接池耗尽，影响整个业务。
  您可以在控制台的查看实例的当前连接数指标。具体操作，请参见[查看实例性能指标](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0027.html)。
  
- 解决方案 具体操作，请参见[执行计划](https://support.huaweicloud.com/usermanual-das/das_04_0048.html)。根据执行计划分析索引使用情况、扫描的行数等，预估查询效率，重构SQL语句、调整索引，提升查询效率。
  ![](https://support.huaweicloud.com/usermanual-rds-mysql/public_sys-resources/note_3.0-zh-cn.png)
  错误地优化慢查询可能会造成业务使用异常，请谨慎操作。
  
 
#### 参数设置不当
- 原因及现象 部分参数（如innodb_spin_wait_delay）设置不当会导致性能变慢。
  您可以在控制台查看实例的参数修改情况。具体操作，请参见[查看当前实例的参数修改历史](https://support.huaweicloud.com/usermanual-rds-mysql/rds_configuration.html#rds_configuration__section6117544122720)。
  图1查看参数修改历史   
  ![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002736542631.png "点击放大") 
- 解决方案 调整相关参数，使其适合业务场景。具体请参见[RDS for MySQL参数调优建议](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_00001.html)。
  
 
#### 批量操作
- 原因及现象 如果有大批量的数据导入、删除、查询操作，会导致SQL执行变慢。
  您可以在控制台查看实例的磁盘总大小、磁盘使用量、IOPS等指标。具体操作，请参见[查看实例性能指标](https://support.huaweicloud.com/usermanual-rds-mysql/rds_08_0027.html)。
  
- 解决方案 在业务低峰期执行大批量操作，或将大批量操作拆分后分批执行。
  
 
#### 定时任务
- 原因及现象 如果实例负载随时间有规律性变化，可能是存在定时任务。
  您可以在控制台查看实例的Delete语句执行频率、Insert语句执行频率、Insert_Select语句执行频率、Replace语句执行频率、Replace_Selection语句执行频率、Select语句执行频率、Update语句执行频率等指标，判断是否有规律性变化。具体操作，请参见[查看监控指标](https://support.huaweicloud.com/usermanual-rds-mysql/rds_06_0003.html)。
  
- 解决方案 调整定时任务的执行时间，建议在业务低峰期执行，并修改可维护时间段为业务低峰期。具体操作，请参见[设置可维护时间段](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0038.html)。
  
 
