【巡检问题分析与最佳实践】RDS MySQL慢SQL问题

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 判断查询的性能就是看查询执行的时间,这个时间针对不同的业务要求上也有差异。在同一时间内SQL执行的越快,执行的SQL就越多,完成的业务逻辑就越多。同样一个业务场景不同的架构设计、数据库表索引设计,由不同的人来做效果是不同的,有的人可以用很低的成本,RDS规格,ECS规格跑出很高的性能。最好的情况是自顶向下了解业务,以及每个业务涉及的SQL,这样就能厘清业务和数据库负载的关系;也能找到短板,并对短板做有针对性的优化;全链路压测就是做的这个事情。

前言

判断查询的性能就是看查询执行的时间,这个时间针对不同的业务要求上也有差异。在同一时间内SQL执行的越快,执行的SQL就越多,完成的业务逻辑就越多。同样一个业务场景不同的架构设计、数据库表索引设计,由不同的人来做效果是不同的,有的人可以用很低的成本,RDS规格,ECS规格跑出很高的性能。最好的情况是自顶向下了解业务,以及每个业务涉及的SQL,这样就能厘清业务和数据库负载的关系;也能找到短板,并对短板做有针对性的优化;全链路压测就是做的这个事情。另外也可以借鉴xtrace,strace等理念在分布式环境中做全链路的监控,阿里云已经有这样的产品叫链路追踪,可以清楚地监控从应用组件到基础组件,哪一个环节耗时最长,哪一个环节报错,详细请参考文档 https://www.aliyun.com/product/xtrace。全链路监控和全链路压测是值得大多数系统学习的。

下面针对数据库的各种导致SQL慢的排查思路,原因和解决方法进行阐述:

实例达到瓶颈

如果监控比较细微或对响应时间比较敏感的话,瓶颈很容易被监控到,达到瓶颈时一般可能有以下几种因素:

  1. 随着业务的增长而没有扩容,总有那么一天系统变慢;
  2. 随着时间的变化,大量的磁盘擦写或快过保的机器性能有损耗,也会达到瓶颈;
  3. 随着时间的累计,数据只增加不清理,表的大小也不断增加,有可能原来不慢的SQL变慢,如:索引缺失;可以借助自治服务诊断。

控制台路径是选择“云数据库RDS”->选择“实例列表”->点击实例链接,进入实例页面->选择“自治服务”->选择“资源监控”,详细参考 https://help.aliyun.com/document_detail/95667.html 。如果资源使用利用率各项指标都100%,可能是实例达到了瓶颈,这时候建议升级实例规格,方法参考 https://help.aliyun.com/document_detail/96061.html

判断实例有没有达到瓶颈,比较好的方法是先找到实例的性能基准值,先用sysbench或其他测试工具构建基准测试,当不管怎么增加压力,数据库的性能再也上不去时说明基准值已经出来了,在复杂场景下的QPS/TPS响应时间很少会超过基准值的。

版本升降级

数据库的版本升级可能会导致SQL执行计划发生改变,执行计划查询类型依次从好到坏的顺序是“system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all”(官方链接 https://dev.mysql.com/doc/refman/5.6/en/explain-output.html#explain-join-types ),查询类型从“range -> index”,因为SQL的请求变慢,业务又不断重试请求,导致SQL并行查询比较多,进而影响应用线程释放慢,导致应用连接池耗尽,影响整个业务。查看近期有没有修改过参数的控制台路径是选择“云数据库RDS”->选择“历史事件”,详细参考 https://help.aliyun.com/document_detail/131008.html ,如下图所示:

1.png

参数调整

参数buffer_pool_instances/join_buffer_size/AHI等的变化也会导致性能变慢。关于这方面的文章比较多,这里不一一赘述。查看近期有没有修改过参数的控制台路径是选择“云数据库RDS”->选择“实例列表”->点击实例链接,进入实例页面->选择“参数设置”->选择“修改历史”,详细参考 https://help.aliyun.com/document_detail/131008.html ,如下图所示:

2.png

缓存失效

缓存的设计在架构上很好地承担了大量的查询,但并不能保证缓存命中率100%,如果缓存失效,也会有大量的查询涌到数据库端,导致性能下降。从数据库表现来说,看到各方面的资源(通常是CPU)打满,QPS/活跃线程飙的非常高。这样的情况RDS MySQL可以用SQL限流、打开线程池、语句并行队列、Fast Query Cache等可以缓解,详情参考https://help.aliyun.com/document_detail/130306.html 。目前数据库自治服务DAS,可以提供自动调参/自动扩容/SQL自动优化/SQL自动限流的工作,详情参考 https://help.aliyun.com/document_detail/164859.html

批量操作

如果有大批量的数据导入、删除、或拖数据的情况。

批量数据导入

这种情况可以从磁盘空间,或SQL洞察/慢查询里找到对应语句。如从binlog的大小,正常情况每个binlog问卷大小是500MB,如果有超过500MB的,就可以看是否有异常情况。

3.png

也可以从监控上看哪部分的空间有变化。

4.png

如果有批量数据导入IOPS上也会增加。5.png

事务数也会增加。

6.png

InnoDB的写入量也会增加。

7.png

日志文件的写入也会增加。

8.png

InnoDB层的写入也会增加。

9.png

批量数据删除/回收

这种情况可以从磁盘空间,或SQL洞察/慢查询里找到对应语句。

10.png

11.png

12.png

可以看到truncate table时select 1都很慢。


13.png

拖数据

这种情况可以通过监控指标的变化或SQL洞察/慢查询里找到对应语句。

14.png

15.png

未关闭的事务

如果某个任务突然变慢,应该考虑是否有锁阻塞的问题。可以通过“如何定位长时间未关闭的事务和处理方法”这篇文章找到未释放的锁,应通过更快地释放锁来改善。如下图CPU和IOPS的利用率并不高,但应用拥堵,MySQL的活跃会话上涨就是存在未关闭的事务导致的。

16.png


未提交事务:

19.png

定时任务

如果负载随时间有规律性变化,则瓶颈随负载有规律性地变化,很大可能是定时任务引起的,如图所示:

20.png

SQL异常

查询慢有很多种原因导致,这种情况可能是由于库表结构设计不合理,或索引缺失,或扫描行数太多,或不常用到的查询条件导致,这种情况需要开发人员修改。

影响SQL语句执行的因素大概分为以下几类:表有哪些索引、存储特性、数据库引擎特性、查询条件的区分度、结果集大小、表的数据量、CPU时间。关于这一点已经讲的比较多,详细可以参考阿里云数据库最佳实践 https://yq.aliyun.com/live/1938

此外还可以使用数据库自治服务优化慢SQL,可参考https://help.aliyun.com/document_detail/167895.html

业务场景发生改变

如何确定业务场景发生了改变呢?有两种可能:

1. 应用进行过发布

应用有没有进行过发布,需要看下应用的部署日志或发布系统可以查到痕迹。

2. 没发布,功能早上线,但不经常用,某天用户点了某个功能。

如果想确切定位同时段的SQL是否一样,就需要打开审计日志。打开审计日志的方法参考文档 https://help.aliyun.com/document_detail/96123.html 。同时段的SQL可以跟昨天同时间对比,或上周同时间对比。借助SQL洞察的SQL分析功能,或者更方便地用DAS专业版的“SQL对比”/“来源统计”。发现和没有问题时间段的SQL,找到来源即可。

22.png

或用DAS数据库自治服务的"一键诊断",路径参考https://help.aliyun.com/document_detail/99478.html

23.png

扫描行数多

路径地址:阿里云控制台->选择对应数据库引擎->找到对应实例,点击“实例ID/名称”->选择“SQL洞察”或“自治服务”里的“慢SQL”

24.png

多表join

这种情况可以通过监控指标的变化或SQL洞察/慢查询里找到对应语句。

25.png

索引不合理

例如:

26.png

全表扫描

全表扫描一般发生在索引不合理或没有WHERE条件的SQL语句中,索引不合理好解决建立合适的索引就可以了,但对于没有WHERE条件的SQL语句发生时可以kill或降级业务解决。没有WHERE条件但SQL语句是高风险SQL,建议分批执行或放在业务低峰期执行,当然了尽量带上WHERE条件。如下图就是不带WHERE条件的,在DAS控制台/慢查询/SQL洞察等都可以找到。

27.png

CPU达到瓶颈

CPU在系统中相当于大脑,当CPU达到瓶颈后调度IO等就慢,也会导致慢SQL产生,这种情况可以从监控指标上看出。如

28.png

IO慢

IOPS达到瓶颈

如果慢SQL里出现DML,很大程度是IOPS利用率较高,如:

29.png

可以从SQL洞察里找到慢SQL:

30.png

也可从慢日志明细看到:

31.png33.png

刷脏导致的IO慢

MySQL触发刷脏的时机有:RedoLog满,内存不够用,内存刷脏过程中的额外开销。这种情况可能会触发Buffer Pool的锁

截屏2020-12-28下午11.40.53.png

lnnoDB缓存读命中率,使用率,胆块率(

(%)

120

80

2020-12-2816:51:00

缓冲池的读命中率(%)

99.98

n1

20

缓冲池的利用率(%)

97.92

缓冲池胆块的百分率(%)

22.48

21:00

18:00

14:00

15:00

16:00

17:00

19:00

20:00

22:00

23:00

缓冲池的利用率(%)

缓冲池脏块的百分率(%)

缓冲池的读命中率(%)

业务场景发生变化

业务进行过发布,或有不经常访问的业务突发访问比如ad-hoc类等,从监控指标上可以看到异常。

image.png

查看历史

近1小时

发起诊断

近12小时

近6小时

2020年12月28日22:47:09

2020年12月28日21:47:09

健诊断

自治中心neW

危险:1警告:0

性能趋势

贤温监控

实时会话

SQL分析

死锁

实时性能

大中务:当前无大务详情

当前时段光新未发生死铺

大会话:14条详情

实例会话

性能洞柴"ew!

话求分析

资无诊断

会话快国

全量SQL

sQL

慢日志

快丽开关:未开启会话快服前往

全HSQL要开启全量SOL高

QPSAVG:269.3MAX:4591.2

CPU用本:AVG:18.7%MAX:

魔SQL款量:6查看

级版前往

开启

100.0%详情

环比地长率:-96.30%上一个

SQL洞亮和审计

网士对长率:0.00%(昨天同村间

段情SQL技量为O)

时段AVG:7268.5)

需要优化的SQL模板校品:无

内存机用率:AVG:65.3%

MAX69.8%

法获取数拼

同比:长半:2780.08%(昨天同

空间分析

时间段AVG:9.3)

IOPS使用率:20.2%

该间后

全量SCL

模SeL

容量评估

锁分析

空间使用

附盘使用率:10.88%详情

实例告誉

剩会可用空间:1.74TB

近一周日均墙长量:164.18GB

性能快照

总结

哪些可以帮助我们定位慢SQL?

  • 监控指标

对比两个时间段的监控指标的差异,如资源层面的差异,引擎层面的差异,选择“云数据库RDS”->选择“实例列表”->点击实例链接,进入实例页面->选择“监控与报警”->选择“资源监控”/“引擎监控”,下面看下各个指标的含义:

监控项

含义

说明

磁盘空间

实例的磁盘空间占用历史趋势,单位GB

IOPS

RDS实例的IOPS(每秒IO请求次数)

连接数

当前总连接数

CPU使用率

RDS实例CPU使用率(占操作系统总数)

网络流量

MySQL实例平均每秒钟的输入、输出流量,单位为KB

QPS/TPS

每秒钟SQL语句执行次数和事务处理数

InnoDB缓存读命中率、使用率、脏块率

InnoDB缓冲池的读命中率、使用率以及缓冲池脏块的百分率

InnoDB读写量

InnoDB平均每秒读取和写入的数据量

InnoDB读写次数

InnoDB每秒钟的读取和写入的次数

InnoDB日志

InnoDB的日志写入情况

MySQL执行语句时在硬盘上自动创建的临时表的数量

执行语句时在硬盘上自动创建的临时表的数量

MyISAM Key Buffer

MyISAM平均每秒的Key Buffer使用状况

MyISAM读写次数

MyISAM平均每秒的读写次数

MySQL_COMDML

数据库每秒SQL语句执行次数,包括的类型如下:Insert、Delete、Insert_Select、Replace、Replace_Select、Select、Update

MySQL_RowDML

InnoDB每秒钟操作执行次数,包括:

  • 每秒向日志文件的物理写次数
  • 每秒从 InnoDB 表读取、更新、删除、插入的行数

  • 慢日志
  • SQL洞察
  • 数据库自治服务

因为上面已经有路径或帮助文档,这里不再赘述。在实际业务场景中情况可能会比上面提到的情况复杂的多,有可能是多种情况的叠加,不过排查问题的思路是一致的,希望上述方法对您有帮助。

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
6月前
|
SQL 人工智能 关系型数据库
AI Agent的未来之争:任务规划,该由人主导还是AI自主?——阿里云RDS AI助手的最佳实践
AI Agent的规划能力需权衡自主与人工。阿里云RDS AI助手实践表明:开放场景可由大模型自主规划,高频垂直场景则宜采用人工SOP驱动,结合案例库与混合架构,实现稳定、可解释的企业级应用,推动AI从“能聊”走向“能用”。
1236 41
AI Agent的未来之争:任务规划,该由人主导还是AI自主?——阿里云RDS AI助手的最佳实践
|
7月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
485 158
|
6月前
|
存储 消息中间件 监控
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
蒋星熠Jaxonic,数据领域技术深耕者。擅长MySQL到ClickHouse链路改造,精通实时同步、数据校验与延迟治理,致力于构建高性能、高一致性的数据架构体系。
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
|
7月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1206 152
|
7月前
|
SQL 监控 关系型数据库
一键开启百倍加速!RDS DuckDB 黑科技让SQL查询速度最高提升200倍
RDS MySQL DuckDB分析实例结合事务处理与实时分析能力,显著提升SQL查询性能,最高可达200倍,兼容MySQL语法,无需额外学习成本。
|
7月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
902 156
|
7月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
505 156
|
7月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
609 161
|
6月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
721 6
|
8月前
|
存储 关系型数据库 MySQL
深入理解MySQL索引类型及其应用场景分析。
通过以上介绍可以看出各类MySQL指标各自拥有明显利弊与最佳实践情墁,在实际业务处理过程中选择正确型号极其重要以确保系统运作流畅而稳健。
249 12

相关产品

  • 云数据库 RDS MySQL 版
  • 云数据库 RDS
  • 推荐镜像

    更多