当前位置: 首页 > 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.rkmt.cn/news/127304.html

相关文章:

  • 小模型逆袭!一文读懂模型蒸馏:为何小参数也能媲美大模型?
  • Open-AutoGLM比价自动化实战,20年技术老兵首次公开核心算法逻辑
  • 为什么顶尖程序员都在研究Open-AutoGLM自动下单?真相曝光!
  • 学Simulink--通信系统场景实例:软件定义无线电(SDR)平台上的信号处理流程
  • 2025 年优质服装批发市场指南:直击采批痛点,打造高效进货新生态 - 速递信息
  • 为什么顶级OTA都在用Open-AutoGLM?,揭秘其背后的价格优势算法
  • 新罗纹纹眉选哪个:专业精选指南必读攻略 - 品牌测评家
  • garfish微前端教程,零基础入门到精通,收藏这篇就够了
  • 为什么90%的快递平台都在研究Open-AutoGLM?真相令人震惊
  • 前端大文件上传,零基础入门到精通,收藏这篇就够了
  • 【独家披露】Open-AutoGLM内部架构图流出:看懂它,你就掌握了下一代智能预订核心
  • AI幻觉问题的终极解决方案:揭秘可靠RAG技术的三重把关机制,让AI从’胡说八道王’升级为’靠谱答题员!
  • AI Agent智能体是什么?和LLM关系是什么?
  • 前端部署更新后,如何优雅地通知用户刷新页面?收藏这篇就够了
  • 揭秘Open-AutoGLM物流数据同步难题:3步实现毫秒级响应
  • 【缺陷检测】图像处理检测PCB故障【含Matlab源码 14739期】
  • KiRequestDispatchInterrupt宏定义和nt!KiIpiServiceRoutine函数到hal!HalRequestSoftwareInterrupt
  • 括号匹配问题
  • (Open-AutoGLM性能优化秘籍):提升酒店数据抓取效率的7种方法
  • 回归测试策略与范围界定:构建可持续的软件质量防线‌
  • 2025-2026 北京继承律师服务品质排行榜推荐:实战案例验证与权威机构口碑名单 - 老周说教育
  • 【技术内幕】Open-AutoGLM如何实现毫秒级外卖订单生成?
  • Open-AutoGLM快递路径预测黑科技(基于时空图神经网络的大模型应用)
  • (最新)2025年有哪些免费降AI率工具?亲测2个靠谱平台,AI率降到15%以内! - 还在做实验的师兄
  • 使用toaster开源库实现警告toast样式
  • SSM校外实习管理平台6tu82(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
  • NMN如何选择?2025 NMN权威榜:抗衰力与成分透明度双维PK,十大品牌谁登顶? - 资讯焦点
  • 伺服驱动器中DSP与FPGA高效协同架构解析
  • ELK日志分析平台从零搭建到生产实践
  • 深圳到北京、天津、石家庄、唐山搬家公司排行榜,附搬家费用明细 - 物流人