当前位置: 首页 > 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.jsqmd.com/news/115367/

相关文章:

  • Windows程序崩溃捕获dump文件
  • 为什么顶尖程序员都在研究Open-AutoGLM自动下单?真相曝光!
  • Open-AutoGLM比价自动化实战,20年技术老兵首次公开核心算法逻辑
  • 小模型逆袭!一文读懂模型蒸馏:为何小参数也能媲美大模型?
  • 2025 年优质服装批发市场指南:直击采批痛点,打造高效进货新生态 - 速递信息
  • 学Simulink--通信系统场景实例:软件定义无线电(SDR)平台上的信号处理流程
  • 为什么顶级OTA都在用Open-AutoGLM?,揭秘其背后的价格优势算法
  • 网络编程-TCP通信
  • 新罗纹纹眉选哪个:专业精选指南必读攻略 - 品牌测评家
  • Comtos Linux 研究的科学与哲学
  • garfish微前端教程,零基础入门到精通,收藏这篇就够了
  • 学Simulink--音频DSP(数字信号处理)场景实例: 音频滤波器设计与实现
  • 错过Open-AutoGLM等于错过下一个物流技术风口(仅限内部分享的优化秘籍)
  • 为什么90%的快递平台都在研究Open-AutoGLM?真相令人震惊
  • 一文了解开源大语言模型文件结构,以 Hugging Face DeepSeek-V3.1 模型仓库为例 - 详解
  • 12.20
  • 学Simulink--电力系统与能源管理场景实例:电动汽车电池管理系统(BMS)的设计与优化
  • 【独家披露】Open-AutoGLM内部架构图流出:看懂它,你就掌握了下一代智能预订核心
  • AI幻觉问题的终极解决方案:揭秘可靠RAG技术的三重把关机制,让AI从’胡说八道王’升级为’靠谱答题员!
  • 新罗纹眉哪家好:最新权威排名深度解析 - 品牌测评家
  • 【弹簧】解决弹簧-质量-阻尼系统的强制振动问题【含Matlab源码 14737期】
  • 前端大文件上传,零基础入门到精通,收藏这篇就够了
  • 2025年CNC数控机床谁家强?设计服务口碑排行榜揭晓,动力刀塔数控车/4轴数控机床/液冷接头数控机床CNC数控机床品牌哪家好 - 品牌推荐师
  • 【故障诊断】稀疏贝叶斯学习方法复合轴承故障诊断【含Matlab源码 14741期】
  • 揭秘Open-AutoGLM物流数据同步难题:3步实现毫秒级响应
  • SwiftUI 如何精准识别用户点击的单词?一套可落地的实现方案
  • AI Agent智能体是什么?和LLM关系是什么?
  • 前端部署更新后,如何优雅地通知用户刷新页面?收藏这篇就够了
  • Open-AutoGLM外卖自动化实战(从部署到上线的完整路径)
  • 揭秘Open-AutoGLM如何实现毫秒级快递轨迹更新:技术架构全解析