当前位置: 首页 > news >正文

别让 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;
http://www.cnnetsun.cn/news/167274.html

相关文章:

  • AI应用开发全景图:从LLM到Agent的硬核指南!这些大模型核心概念你必须懂
  • 揭秘Open-AutoGLM如何实现毫秒级快递轨迹更新:技术架构全解析
  • 换个角度看境外支付系统:警惕金融风险之安全测试实践
  • Home-Assistant智能家居平台搭建与远程控制
  • 盲盒小程序定制案例|轻松打造专属盲盒乐园
  • 【Open-AutoGLM快递轨迹追踪实战】:掌握AI驱动物流监控的5大核心技术
  • 【Open-AutoGLM酒店比价实战】:揭秘AI驱动的实时价格监控系统核心技术
  • requirements.txt配置踩坑实录,99%新手都会忽略的5个关键包
  • Open-AutoGLM部署效率提升10倍?你不可错过的Docker优化策略
  • 收藏!非技术党也能玩转大模型:10大行业落地指南+可复制提示词模板
  • Hugging Face下载Open-AutoGLM太慢怎么办?资深工程师推荐4种加速方案
  • 【专家级调优建议】:提升Open-AutoGLM ModelScope镜像运行效率的7种方法
  • 多进程相关函数
  • 持续集成中的测试策略:构建高效质量保障体系
  • 什么是持续集成CI,与DevOps关系
  • 结构类算法题
  • 为什么你的Open-AutoGLM部署总失败?Docker最佳实践全解析
  • Open-AutoGLM安装总失败?深度解析Python依赖树中的隐藏陷阱
  • 软件测试生命周期管理的核心框架与实践策略
  • 计算机毕设java疫情背景下大学生宿舍管理系统 基于Java的疫情环境下高校宿舍智能化管理系统开发 疫情防控期间大学生宿舍管理的Java平台构建与应用
  • 别再有线连接了!Open-AutoGLM无线调试究竟有多强大?
  • Open-AutoGLM权限困境破解,一文搞定非root环境下的完整部署流程
  • 安卓13适配倒计时,Open-AutoGLM开发者必须掌握的8项声明式权限配置技巧
  • Open-AutoGLM模型下载加速指南(仅限内部使用的CDN加速方案曝光)
  • 复盘:我们是如何将测试周期缩短50%的
  • spring16,17-加载properties文件,容器
  • 黑客和程序员谁更胜一筹?从技术实力、就业范围到赚钱潜力的全方位对比
  • 揭秘Open-AutoGLM虚拟机部署难题:99%新手都会忽略的3个关键细节
  • Open-AutoGLM如何秒连WiFi?:工程师不会告诉你的4种高效方案
  • Open-AutoGLM模型拉取卡顿?:3步诊断+4大加速引擎推荐