数据库慢查询分析
为什么会产生慢查询
数据库,无论是传统的关系型数据库,还是最新流行的分布式数据库,如果用户使用的 SQL 不当,或者错误开启/关闭数据库某些特殊功能,数据库服务性能就会受到明显的影响,对外表现就是慢查询突然剧增,最终导致应用服务受到影响。
如果用户要对数据库的慢查询进行分析,首先需要了解数据库的运行机制。
在数据库内部,从架构层面主要分为两大部分:
1. SQL 解析与访问计划生成:将数据库中标准的 SQL 语言解析成数据库内部的计算语言;访问计划生成,则是将一个复杂 SQL 的访问逻辑,根据数据库自身的机制,组合成一个新的访问计划。
2. 真实数据存储:在数据库的真实存储存储区中,又包含了索引数据和真实数据两个重点部分。数据库索引是为了提升数据查询效率的一种数据结构,真实数据则是数据库中保存的用户数据。
在一般的情况下,数据库出现慢查询,一般是以下情况导致:
SQL 编写不规范导致数据库生成了错误的访问计划,例如:应该采用NL Join 的场景,数据库却错误选用了 Hash Join 来进行关联访问;
数据库访问没有使用索引查询,而是通过表扫描获取满足条件的记录;
服务器资源紧张,导致数据库运行缓慢,例如:数据库请求瞬间激增,CPU 满负荷工作,服务器出现卡顿现象;
慢查询如何定位
从慢查询出现,到了解慢查询如何产生,那么对于一个在线运行的数据库系统,又应该如何定位导致当前数据库出现慢查询的原因呢?
用户在对慢查询进行问题定位时,可以从以下几个维度进行信息收集;
查看数据库自动收集的慢查询SQL 命令,分析其中是否存在SQL 调优的空间;
查看数据库当前正在运行的SQL 命令,分析其中是否存在大量表扫描的操作;
查看数据库当前正在运行的SQL 命令,分析其中是否存在需要占用大量服务器资源的操作;
查看当前服务器的资源使用情况,是否存在某项资源紧张的现象;
用户只有正确收集了以上的信息,才能够从中分析出数据库出现慢查询的原因。
慢查询优化建议
当用户遇到数据库出现慢查询后,只要能够正确收集信息,分析出是什么具体的原因导致了数据库先出现慢查询,就是对症下药,有针对性的进行问题解决。例如,如果数据库出现慢查询是因为SQL 的访问计划不理想,可以通过合理调整SQL 语句从而让数据库生成一个更加合理的访问计划;如果导致慢查询的原因是因为某张表缺少索引,则对该表添加相应索引即可很好地解决慢查询的问题。
SequoiaDB 巨杉数据库架构
SequoiaDB 整体架构
SequoiaDB 采用的是计算和存储分离技术架构,整个数据库集群分为两大部分,计算实例节点和分布式存储引擎。在计算节点中,SequoiaDB 为用户提供丰富的计算实例,包括:MySQL计算实例、PostgreSQL计算实例、SparkSQL 计算实例、JSON计算实例、S3计算实例和 PosixFS 计算实例。

协调节点
协调节点是分布式存储引擎中的路由节点,本身不保存数据,为计算实例节点提供存储引擎的连接和负载均衡服务;
编目节点
编目节点是分布式存储引擎的元数据节点,主要保存分布式存储引擎中的集群拓扑结构、数据表切分规则等重要数据;
数据节点
数据节点是分布式存储引擎保存真实业务数据的角色节点。它为用户提供了高可用的数据存储能力和横向扩容的弹性扩展能力。
SequoiaDB 如何定位慢查询
用户在使用 SequoiaDB 中,如果遇到了慢查询,问题定位的方式也是遵循同样的原则:
查看数据库出现慢查询的 SQL,是否存在 SQL 调优的空间;
查看慢查询的 SQL,是否正确执行了索引查询;
查看当前数据库中正在运行的命令,是否存在占用大量资源的请求;
查看服务器的资源使用情况,是否某项资源紧张而造成数据库性能下降。
在 SequoiaDB 中,已经完整地为用户提供了慢 SQL 的收集和归档,同样的 SequoiaDB 也为用户提供了 EXPLAIN 方法,能够方便用户快速查看每个 SQL 具体的访问计划。
SequoiaDB 对于 SQL 计算实例在访问底层的分布式存储引擎时,为用户提供了SNAPSHOT 快照查询接口,方便用户即时查看底层分布式存储引擎中的数据检索方法。对于服务器的资源使用情况,用户可以通过 SNAPSHOT 快照进行查看,同时也可以通过 SAC 图形化管理工具进行查阅。

SequoiaPerf 介绍
在 SequoiaDB 数据库集群中,用户可以通过数据库提供的丰富接口,获得数据库当前运行的所有信息,对于慢查询问题定位,是有极大的帮助的。但如果让用户单纯地通过命令行方式查看数据库的相关信息,对新手用户可能会觉得比较复杂。

SequoiaPerf展示慢查询的定位方式
SequoiaPerf 慢查询分析
用户在通过 SequoiaPerf 对 SequoiaDB 数据库集群进行慢查询分析时,可以直接通过“Slow Query”页面查看数据库集群近期,都有哪些SQL是超出设置的查询时间阈值的。



用户在 SequoiaDB 分布式存储引擎的执行页面中,可以继续点击列表中“Time Spent”一栏的信息,获取存储引擎中各个数据节点详细的执行信息。

SequoiaPerf 介绍
SequoiaPerf 除了能够协助用户对慢查询快速定位分析,还能够帮助用户全面监控SequoiaDB 数据集群。
在 SequoiaPerf 的首页上,用户可以对 SequoiaDB 数据库集群运行情况做一个宏观的浏览,快速查阅当前集群的运行情况。

在SequoiaPerf的服务器资源页面上,用户可以了解服务器更加详细的信息。

例如服务器磁盘的I/O使用情况,可以通过放大图表获得更加详细的数据。同时用户也可以通过页面右上角的时间栏,选择查看近期一段时间的资源使用情况。

在 SequoiaPerf 监控界面中,用户可以对 SequoiaDB 的MySQL计算实例节点进行监控,用户可以通过监控界面,获得 MySQL 计算实例节点的详细信息。

总结
往期技术干货巨杉Tech | SequoiaDB高可用原理详解
巨杉Tech | 分布式数据库负载管理WLM实践
巨杉Tech | 巨杉数据库的HTAP场景实践
巨杉Tech | SequoiaDB SQL实例高可用负载均衡实践
巨杉Tech | 并发性与锁机制解析与实践
巨杉Tech | 几分钟实现巨杉数据库容器化部署
巨杉Tech | “删库跑路”又出现,如何防范数据安全风险?
巨杉Tech | 分布式数据库千亿级超大表优化实践
社区分享 | SequoiaDB + JanusGraph 实践
巨杉Tech | 巨杉数据库的并发 malloc 实现
巨杉数据库无人值守智能自动化测试实践







