news 2026/4/16 12:01:03

别让 PG 背锅:一次真实慢查询的 7 步排查记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别让 PG 背锅:一次真实慢查询的 7 步排查记录

问题定位与解决方案

慢查询问题定位慢查询主要出现在以下SQL语句:

SELECT o.id, o.amount, u.nick FROM orders o JOIN users u ON u.id = o.user_id WHERE o.status = 'PAID' AND o.pay_time >= '2025-12-17 00:00:00' ORDER BY o.id DESC LIMIT 20;

执行时间为38秒,问题根源在于索引未有效过滤数据,导致全表扫描。

执行计划分析通过EXPLAIN (ANALYZE, BUFFERS)分析执行计划:

Limit (cost=0.56..2923.45 rows=20 width=48) (actual time=38042.213..38042.215 rows=20 loops=1) -> Nested Loop (cost=0.56..2342342.11 rows=16043 width=48) -> Index Scan Backward using orders_pkey on orders o (cost=0.56..823234.22 rows=16043 width=32) Filter: ((status = 'PAID'::order_status) AND (pay_time >= '2025-12-17 00:00:00'::timestamp)) Rows Removed by Filter: 12345678 -> Index Scan using users_pkey on users u (cost=0.56..8.77 rows=1 width=24) Index Cond: (id = o.user_id) Buffers: shared hit=52346 read=1234567 I/O Timings: read=30452.123

关键问题在于Rows Removed by Filter: 12345678,说明索引未有效过滤数据。

索引优化方案现有索引:

\d orders Indexes: "orders_pkey" PRIMARY KEY, btree (id) "idx_orders_status" btree (status) "idx_orders_paytime" btree (pay_time)

优化方案是创建复合索引:

CREATE INDEX CONCURRENTLY idx_orders_status_paytime_id ON orders (status, pay_time DESC, id DESC);

优化后执行计划:

Limit (cost=0.56..12.34 rows=20 width=48) (actual time=0.381..0.389 rows=20 loops=1) -> Index Scan using idx_orders_status_paytime_id on orders o ... Index Cond: ((status = 'PAID'::order_status) AND (pay_time >= '2025-12-17 00:00:00'::timestamp)) Buffers: shared hit=64

执行时间从38秒降至0.38毫秒。

参数优化调整以下参数以进一步提升性能:

ALTER SYSTEM SET random_page_cost = 1.1; ALTER SYSTEM SET work_mem = '32MB'; SELECT pg_reload_conf();

验证与效果优化后SQL平均执行时间从28秒降至0.4毫秒,QPS回升至1.9万。

常用诊断SQL

-- 当前活跃慢查询 SELECT pid, now()-xact_start, left(query,120) FROM pg_stat_activity WHERE state='active' AND now()-xact_start > interval '3 s'; -- 表+索引大小 SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC LIMIT 10; -- 未使用的索引 SELECT schemaname, relname, indexrelname, idx_scan FROM pg_stat_user_indexes WHERE idx_scan=0;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 11:05:21

Comtos Linux 研究的科学与哲学

【Comtos Linux 研究的科学与哲学】人们谈论到Unix/Linux的哲学。 基本都是谈论其设计哲学。 如: 1.小即是美。 2.让程序只做好一件事。 3.可移植性比效率更重要。哲学的基本论域主要包括‌, 本体论‌、‌认识论‌、‌ 价值论‌、和‌方法论‌, 四个核心…

作者头像 李华
网站建设 2026/4/16 10:39:40

为什么顶尖物流企业都在用Open-AutoGLM做信息同步?真相揭晓

第一章:为什么顶尖物流企业都在用Open-AutoGLM做信息同步?真相揭晓在物流行业高速发展的今天,信息同步的实时性与准确性成为企业竞争力的核心。Open-AutoGLM 作为一款开源的自动语义对齐框架,凭借其强大的自然语言理解与多源数据融…

作者头像 李华
网站建设 2026/4/10 22:43:46

SwiftUI 如何精准识别用户点击的单词?一套可落地的实现方案

一. 引言在实际开发中,我们经常会遇到这样的需求:点击一段英文文本中的某个单词弹出释义 / 高亮该单词或者执行自定义逻辑(查词、收藏等)比如下面这一段话 用户点击 finance,而不是整句话。I have a passion for more…

作者头像 李华
网站建设 2026/4/15 3:49:48

(Open-AutoGLM性能优化秘籍):提升酒店数据抓取效率的7种方法

第一章:Open-AutoGLM 酒店预订比价在现代旅行场景中,用户期望以最优价格获取理想的住宿服务。Open-AutoGLM 是一个开源的自动化大语言模型代理框架,能够结合多源数据实现智能比价决策。通过集成主流酒店平台的公开API接口,该系统可…

作者头像 李华
网站建设 2026/4/15 15:06:28

Kotlin资源合集

123814_132258_59门编程语言学习书籍700多本PDF【合集】 文件大小: 50.4GB内容特色: 59门语言700经典PDF一次打包,50GB硬核藏书适用人群: 零基础到进阶开发者、竞赛/考研/转码选手核心价值: 一书在手速查语法/算法/实例,省却全网搜索时间下载链接: http…

作者头像 李华