RDS for MySQL 慢SQL问题分析

MySQL
问题描述

我的 RDS for MySQL 慢查询数很高,我该如何排查问题并解决?

如下图:在 RDS MySQL 控制台上点击 "监控告警","引擎监控",再点击 "访问",查看 "慢查询数" 指标,会发现在一个时间段内出现尖刺

alt

问题分析

在真实的使用场景中,总体的架构设计和数据库表设计都会影响数据库的查询性能,优秀的架构设计会提高数据库整体的性能,反之会出现性能问题。

出现慢 SQL 主要有如何几点原因:

  • 数据库表结构设计不合理,表中没有索引,大量的全表扫描或者扫描行数太多。

  • 表中数据量发生变化,但是统计信息未及时更新。

  • 业务量持续增长,实例没有及时扩容导致达到性能瓶颈。

  • 批量的更新,插入,删除。

除此之外,还有一些不是很常见的原因,但是也需要引起足够的重视:

  • 参数设置不当导致,如 innodb_buffer_pool_instance [1]在较小的实例上设置过大导致争用,或者是因为join_buffer_size [2]设置过小导致性能下降。

  • 数据库版本升级之后,可能由于统计信息为更新,或者是因为执行计划发生变化,可能导致慢 SQL 个数在一段时间内出现尖刺。

  • innodb 缓存命中率出现下降:buffer pool 将热数据缓存,在访问时不用去磁盘加载数据。如果缓存命中率很低,导致大量的查询直接路由到存储,导致性能下降。

解决方案
  1. 设置符合您业务的慢日志参数[3]。

  2. 进行工作负载分析[4]。

  3. 运行 explain 命令 分析执行计划,对于连接类型的执行计划从好到坏依次是[5]:system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>all,您需要尽可能优化SQL以达到最好的执行计划。

  4. 如果有批量操作,如 大批量的插入,更新,删除,或者是定时任务,可以放在业务低峰期进行操作,或将批量操作拆分后分批执行。

参考文档

[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

如果您有其他问题,欢迎您联系火山引擎技术支持服务

105
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论