我的 RDS for MySQL 慢查询数很高,我该如何排查问题并解决?
如下图:在 RDS MySQL 控制台上点击 "监控告警","引擎监控",再点击 "访问",查看 "慢查询数" 指标,会发现在一个时间段内出现尖刺
在真实的使用场景中,总体的架构设计和数据库表设计都会影响数据库的查询性能,优秀的架构设计会提高数据库整体的性能,反之会出现性能问题。
出现慢 SQL 主要有如何几点原因:
-
数据库表结构设计不合理,表中没有索引,大量的全表扫描或者扫描行数太多。
-
表中数据量发生变化,但是统计信息未及时更新。
-
业务量持续增长,实例没有及时扩容导致达到性能瓶颈。
-
批量的更新,插入,删除。
除此之外,还有一些不是很常见的原因,但是也需要引起足够的重视:
-
参数设置不当导致,如 innodb_buffer_pool_instance [1]在较小的实例上设置过大导致争用,或者是因为join_buffer_size [2]设置过小导致性能下降。
-
数据库版本升级之后,可能由于统计信息为更新,或者是因为执行计划发生变化,可能导致慢 SQL 个数在一段时间内出现尖刺。
-
innodb 缓存命中率出现下降:buffer pool 将热数据缓存,在访问时不用去磁盘加载数据。如果缓存命中率很低,导致大量的查询直接路由到存储,导致性能下降。
-
设置符合您业务的慢日志参数[3]。
-
进行工作负载分析[4]。
-
运行 explain 命令 分析执行计划,对于连接类型的执行计划从好到坏依次是[5]:system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>all,您需要尽可能优化SQL以达到最好的执行计划。
-
如果有批量操作,如 大批量的插入,更新,删除,或者是定时任务,可以放在业务低峰期进行操作,或将批量操作拆分后分批执行。
[1] https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_buffer_pool_instances
[2] https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_join_buffer_size
[3] https://www.volcengine.com/docs/6562/81211
[4] https://www.volcengine.com/docs/6562/80365
[5] https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
如果您有其他问题,欢迎您联系火山引擎技术支持服务