在相同业务场景下,架构设计和库表索引设计会影响查询性能,良好的设计可以提高查询性能,反之会出现很多慢SQL(执行时间很长的SQL语句)。本文介绍导致慢SQL的原因和解决方案。
SQL异常
- 原因及现象
SQL异常的原因很多,例如库表结构设计不合理、索引缺失、扫描行数太多等。
您可以在控制台的SQL洞察页面,查看慢SQL的执行耗时、执行次数等信息。
- 解决方案
根据实际业务情况优化SQL。具体操作,请参见SQL优化。
实例瓶颈
版本升级
- 原因及现象
实例升级版本可能会导致SQL执行计划发生改变,执行计划中连接类型从好到坏的顺序是system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>all。更多信息,请参见MySQL官方文档。
range和index连接类型时,如果SQL请求变慢,业务又不断重发请求,导致并行SQL查询比较多,会导致应用线程释放变慢,最终连接池耗尽,影响整个业务。
您可以在控制台的监控与报警页面,单击标准监控页签,在资源监控内可以查看实例的连接数情况。
- 解决方案
根据执行计划分析索引使用情况、扫描的行数等,预估查询效率,重构SQL语句、调整索引,提升查询效率。具体操作,请参见SQL优化。
参数设置不当
- 原因及现象
参数innodb_buffer_pool_instances、join_buffer_size等设置不当会导致性能变慢。
您可以在控制台的参数设置页面,单击修改历史页签,查看实例的参数修改情况。
- 解决方案
调整相关参数,使其适合业务场景。
缓存失效
- 原因及现象
缓存可以很好地承担大量查询,但是并不能保证缓存命中率100%,如果缓存失效,也会有大量的查询路由到数据库端,导致性能下降。
您可以在控制台的监控与报警页面,单击标准监控页签,在引擎监控内可以查看实例的缓存命中率、QPS、TPS等。
- 解决方案
可以使用Thread Pool、Fast Query Cache、自动SQL限流等功能提高性能。
批量操作
- 原因及现象
如果有大批量的数据导入、删除、查询操作,会导致SQL执行变慢。
可以从磁盘空间、SQL洞察或者慢查询里找到对应语句。例如查看Binlog大小,正常情况单个Binlog大小是500 MB,如果有超过500 MB的,可以查看是否有异常。
您也可以在控制台的监控与报警页面,单击标准监控页签,在资源监控和引擎监控内可以查看实例的磁盘空间、IOPS、事务等情况。
- 解决方案
在业务低峰期执行大批量操作,或将大批量操作拆分后分批执行。
未关闭事务
- 原因及现象
如果某个任务突然变慢,查看CPU和IOPS的使用率并不高,而且活跃会话持续增多,通常是因为存在未关闭的事务。
- 解决方案
检查导致事务冲突的锁并中止对应的SQL语句。
定时任务
- 原因及现象如果实例负载随时间有规律性变化,可能是存在定时任务。说明 您可以在监控与报警页面的标准监控页签查看相关监控信息。
- 解决方案
调整定时任务的执行时间,建议在业务低峰期执行。
总结
RDS上定位慢SQL的主要方法如下:
结合RDS提供的这些功能,可以有效帮助您快速定位甚至自动解决慢SQL问题。