DBeaver 执行计划避坑指南:3 步把 5 秒慢查询压到 0.1 秒
【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver
周五下午,一条 JOIN 跑了 8 分钟,DBA 在群里 @ 你:给我执行计划。别慌,打开 DBeaver 的 SQL 编辑器,选中查询点一下 Explain,整棵执行计划的树就摆了出来——瓶颈藏在哪个节点,一眼就能揪出来。
先搞懂执行计划在说什么
执行计划说白了就是数据库的"施工图纸":它不执行,只告诉你打算怎么执行。你把一条 SQL 扔过去,优化器会先盘算一套读取、连接、排序、聚合的步骤,再照着干。DBeaver 做的事,就是把这套步骤从干巴巴的文本里拉出来,画成一棵树。
读树有个口诀:从根往下扫,先找"谁扫了最多数据",再找"谁被反复执行"。就像看工厂流水线,先看哪台机器堵住了,再看它是不是卡在最关键的工序上。想看 DBeaver 是怎么把各家数据库五花八门的 EXPLAIN 输出统一成这一棵树的,可以翻一下 执行计划的模型抽象。
怎么在 DBeaver 里一键生成执行计划
操作就三步,全程鼠标:
- 连上目标库,在 SQL 编辑器里写好查询
- 选中最外层 SELECT(或者直接 Ctrl+A 全选)
- 点工具栏上的 Explain("解释计划")按钮
点完,编辑器里就弹出执行计划视图,节点能展开、折叠,点任意一个能看到它的行数、成本、扫描方式。这个视图的渲染逻辑在 ExplainPlanViewer 里。
点了没反应或者报错,常见就三种:SQL 有语法错误(优化器根本没走到)、当前账号没权限跑 EXPLAIN、或者这个库压根不支持。DBeaver 会在状态栏直接提示,比如 "Can't explain plan for command",别在那干瞪眼。
实战:一条慢查询怎么从 5 秒压到 0.1 秒
拿一条典型的报表查询开刀:
SELECT * FROM orders o JOIN order_items oi ON o.id = oi.order_id WHERE o.create_time > '2023-01-01' AND o.status = 'PAID';生成执行计划,一眼看出两处要命:orders走的是全表扫描,一百多万行全读进来;order_items靠主键做嵌套循环连接,但驱动表那边没索引,等于每行都要硬扫。
改法就是加索引,把过滤和连接都喂上料:
CREATE INDEX idx_orders_ct_status ON orders (create_time, status); CREATE INDEX idx_items_order_id ON order_items (order_id);重新生成执行计划,两张表都变成索引扫描,耗时从 5 秒掉到 0.1 秒。瓶颈从来不在 SQL 写得多花哨,而在数据库选没选对读法。
MySQL 的 JSON 执行计划怎么读
MySQL 的 EXPLAIN 有表格版和 JSON 版,DBeaver 默认帮你走 JSON 那套,因为信息更全——它把每一步的 cost、rows、attached_condition 都塞进去了。这套解析逻辑在 MySQL 的 JSON 计划解析器 里,对应的是EXPLAIN FORMAT=JSON。
| 节点看什么 | 危险信号 | 该咋办 |
|---|---|---|
| type / 扫描方式 | ALL(全表扫描) | 给过滤列加索引 |
| rows / 估算行数 | 接近表总行数 | 检查 WHERE 有没有被索引接住 |
| Extra | Using filesort / Using temporary | 用索引消掉排序和临时表 |
| key / 用的索引 | None | 连接列没走索引,补上 |
其他库大同小异,一句话点评:PostgreSQL 的EXPLAIN ANALYZE能给出真实执行耗时,比估算值更靠谱;OceanBase 也走 JSON,DBeaver 单独做了适配。字段名各家不太一样,但"谁扫得多、谁没走索引"这个判断标准是通用的。
拿走就能用
- 慢查询先点 Explain,别猜——看树,找最大的扫描节点
- 看到 ALL / None / Using filesort,先想索引,再想改写 SQL
- 改完索引必须重新生成执行计划确认,别信"应该快了"
下次 DBA 再 @ 你,直接甩一张执行计划截图过去。有跑不通的库,去社区 Issue 区翻翻是不是有人踩过同一个坑。
【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考