一条慢SQL、一次突发的CPU飙升、一阵连接数暴涨……这类数据库性能问题往往来得猝不及防,而面对这些情况,有些DBA总能凭借实战沉淀,形成独有的判断逻辑与标准化排查思路。
第十二期【专家有话说】邀请到崔虎龙、张维照、刘智龙三位经验丰富的DBA专家,分享他们在面对数据库性能问题时的“第一反应”——先看什么、后看什么,以及背后的判断依据是什么。希望能为各位DBA提供一些参考和启发,帮助大家逐步建立自己的排查思路与处理方式。
🎙️崔虎龙

作为一名在数据库圈子里混了十几年的老手,我亲眼看着这个市场一步步演变:从最早全是国外商用数据库的天下,到后来开源浪潮席卷而来,再到现在国产信创数据库慢慢崛起。这些年踩过的坑、排过的雷数都数不清,尤其是数据库性能问题的排查,真是让人头秃又不得不干的老本行。
关于应对数据库性能问题的排查,我始终有一个核心观点:要对自己有明确的定位——不要把自己当成“修理工”,而要当成“侦探”。你的第一反应不该是“怎么修”,而是问自己三个问题:在哪里、什么时候、发生了什么。
一个专家级DBA的第一反应应当是:一边止损、一边留证。记住那句万能口诀:先别急着重启。给我10秒钟,让我看一眼案发现场有没有被破坏。
这里分享我整理的一套排查方法论:
- 第一步:自下而上 vs 自上而下
先排查底层(硬件/OS),再查上层(数据库/SQL)。如果你一上来就冲进数据库看慢查询日志,而实际问题是磁盘满了、CPU飙升、网络拥堵,那你就白白浪费了宝贵的30分钟。
- 第二步:抓取故障现行状态
要问自己:“此刻正在发生什么?”慢查询日志记录的是历史,往往等你翻完日志,故障要么已经恢复,要么已经扩散了。以MySQL为例:不是直接执行show processlist,而是先看错误日志。
- 第三步:看现场三要素——时间、锁、资源
当你定位到一条卡住的SQL,脑子里要立刻形成决策树。比如:开启事务没提交,堵住了DDL?行锁升级为间隙锁?统计信息陈旧,导致选错索引?是“并发”击穿了资源?
- 第四步:分级止血——在不重启的情况下恢复服务
分析问题的同时,手要准备按下“核按钮”,按风险排序:
Level 1(低风险):kill 掉那些导致全表扫描的慢SQL——找出PID,执行kill connection。
Level 2(中风险):临时调整超时参数,比如调小innodb_lock_wait_timeout,或减轻日志压力。
Level 3(高风险/最后手段):重启数据库。注意:重启解决不了性能逻辑问题,只会掩盖问题。
各位DBA朋友想要练出专业的应对数据库性能问题的“第一反应”,可以尝试以下刻意练习的方法:建立决策树思维:不要死记硬背命令,而是在脑子里画一张流程图。例如:CPU高 → 是系统态高还是用户态高?系统态高 → 查中断/上下文切换用户态高 → 查SQLSQL有索引吗? → 检查统计信息
另外请牢记:碰到性能故障,第一反应不是“重启试试”,而是 “我想看看”。冷静观察60秒,胜过手忙脚乱60分钟。
最后,关于目前AI在数据库场景中的使用,我认为AI并不是代替你完成排查,而是做为你的辅助,负责快速检索、结构化输出、决策树推演、生成操作命令;你需要负责判断、执行、兜底。
🎙️张维照

早期DBA遇到性能问题,第一反应是冲进监控系统翻指标——CPU、IO、慢查询日志一通查。这个动作本身没错,但容易陷入“数据海洋而找不到方向”。
其实数据库性能问题排查,看似是技术问题,本质上更像医生问诊。我在处理性能异常时,经常会借鉴中医“望闻问切”的思路,避免一上来就陷入SQL分析或参数调整的细节之中。
-
第一步是“望”。先看整体运行状态,包括CPU、内存、IO、网络、会话数、连接数、等待事件、负载趋势等监控数据,判断问题是全局性的还是局部性的,是资源瓶颈还是业务逻辑导致。很多时候,通过“望”就能快速发现异常点,例如IO突增、锁等待堆积、连接池耗尽等现象。
-
第二步是“闻”。听系统在“说什么”。查看数据库告警日志、操作系统日志、存储告警、集群事件以及监控告警信息。数据库出现性能问题往往会留下蛛丝马迹,日志中记录的信息很多时候比盲目分析更有效。
-
第三步是“问”。向业务、开发、现场运维了解情况。我经常会问几个问题:问题从什么时候开始?近期是否发布过版本?是否有参数调整、数据迁移、统计信息收集或基础设施变更?在实际工作中,超过一半的性能问题最终都与“变化”有关,而不是数据库自身突然出现问题。
-
第四步是“切”。在掌握现象和背景后,分层精准把脉。 系统层资源饱和瓶颈;数据库层错误配置、缺陷、锁堵塞、等待事件、基线对比;SQL层执行计划、统计信息、TOP SQL;应用层并发、连接风暴、热对象;找到真正导致性能下降的关键因素后,就可以制定优化方案。
不过有时也容易陷入一个误区:性能异常出现后,第一时间就去抓慢SQL。但实际上,慢SQL往往只是结果而非原因。如果没有经过“望闻问切”的过程,很容易头痛医头、脚痛医脚。每一步都形成“假设”,然后用数据验证或小范围实验证伪,不要轻信单方面描述,误导了诊断方向。因此,我的经验是:先看全局,再看细节;先了解现象,再分析原因;先确认瓶颈,再实施优化。 用“望闻问切”的思维建立系统化排查框架,不仅能提高故障处理效率,更能培养DBA对复杂问题的整体判断能力。
在当下这个阶段,我认为DBA还应该学会借助AI大模型和知识图谱来辅助诊断。尤其是将企业内部的故障案例、运维手册、应急预案、架构文档构建成知识图谱后,再结合大模型进行推理和关联分析,很多原本需要数小时甚至数天定位的问题,可能在几分钟内就能找到方向。未来优秀的DBA,不仅要会看监控、懂原理,更要学会驾驭AI,让经验与智能形成合力。
最后我想分享一点与技术同样重要的感悟——保持持续学习的心态。这些年数据库技术栈正在快速演进,从传统集中式数据库到分布式、云原生数据库,从Oracle、DB2等商业数据库到各类国产数据库,底层架构、诊断思路和优化方法都在发生变化。过去积累的经验固然宝贵,但如果过度依赖经验,也可能成为认知升级的障碍。
我很认同乐其老板的一句话:“我担心的不是年龄增长,而是自己的知识结构老去;担心那些曾经引以为傲的东西,最终成为自己的绊脚石。” 这句话对技术人尤其具有警醒意义。很多时候,限制我们的不是知识不够,而是过于相信过去的成功经验。作为DBA,我们既要尊重经验,更要敢于挑战经验,主动研究新技术、新架构和新趋势,避免陷入路径依赖和思维茧房。
🎙️刘智龙

做了这些年PostgreSQL运维,碰到性能异常的第一反应总结下来就一句话:先定性,再定位,别急着动手。这里我也以PostgreSQL为例,为大家总结了一些我一般的排查方法:
- 第一步:确认是不是真慢了
用户说慢和系统真的慢其实是两回事。第一件事是看监控——QPS掉没掉、延迟涨没涨、CPU/IO有没有异常。有时候只是某个接口超时了,数据库完全正常。不要被人带节奏,看一眼pg_stat_activity的等待事件,比听十分钟描述有用。
- 第二步:定性瓶颈在哪一层
性能问题最常见的坑,就是一上来就盯着数据库调。实际上瓶颈可能在应用层(连接池满了)、网络层(跨机房延迟)、存储层(IOPS打满)、OS层(内存不足swap),最后才是数据库层。我一般先看三个数:CPU是user高还是sys高、内存有没有高page换入换出、磁盘真实读写是否抖动。这三个数能直接告诉你该往哪个方向走。
- 第三步:在数据库层,看等待事件而不是看SQL
到了数据库层,新手容易上来就抓慢SQL。更高效的做法是先看等待事件——是LWLock争用、buffer mapping锁、还是WALWrite等 IO?等待事件直接告诉你“数据库在等什么”。等定位到等什么了,再去找对应的SQL,事半功倍。
-
第四步:避免的坑
-
不要上来就调PostgreSQL参数。shared_buffers调来调去治不了IO瓶颈。
-
不要只盯着单个慢查询。有时候问题是一堆正常查询同时打进来,单个看都没问题。
-
不要忽略连接数。max_connections设太大,连接风暴的时候神仙也扛不住。
-
性能排查的本质不是修数据库,是找到那个“最先变慢的组件”。把排查顺序建好了,大部分问题在第一步第二步就定位了,根本不用走到改代码改参数那一步。
本期【专家有话说】专栏中,三位专家应对数据库性能问题的的排查思路各有侧重,但落到实操上,共识度很高。崔虎龙强调DBA不应是修理工,先留存现场、自下而上排查,分级止血,用决策树思维替代死记硬背。张维照借用中医“望闻问切”思路,提出先全局后细节、先溯源后优化的排查逻辑,并提醒慢SQL往往只是结果而非原因。刘智龙则总结了先定性,再定位,别急着动手的原则,先确认故障状态是不是真的、瓶颈到底卡在哪一层。
综合来看,三位专家都在反复叮嘱同一件事:面对数据库性能问题,冷静观察比手忙脚乱更有效。真正成熟的DBA早已建立了一套从全局到局部、从现象到本质的系统化排查思维。当前数据库技术迭代速度快,国产数据库也在不断铺开、AI工具加速赋能,新时代的DBA早已不能依赖固有经验运维。唯有搭建属于自己的排查体系、保持终身学习的心态、善用工具,同时敢于挑战过往经验,才能从容应对各类复杂性能故障,练就属于自己的、稳准狠的“第一反应”。
本文已收录至墨天轮社区【专家有话说】内容专栏,点击可阅读往期专家专栏文章。




