网易首页 > 网易号 > 正文 申请入驻

一个索引让查询慢10倍:PostgreSQL这4小时踩坑实录

0
分享至

凌晨2点,生产环境告警。查询耗时从200毫秒飙到2秒,CPU打满。罪魁祸首?我们刚加的那个"优化索引"。

这事听起来像段子,但确实是上周发生的真事。团队花了4小时才定位问题,最后发现错得离谱又合理——我们太相信直觉,忘了数据库优化第一条规则:EXPLAIN ANALYZE(执行计划分析)不是可选项,是必选项

复合索引的顺序,比想象中更挑剔

问题出在一个看似标准的复合索引。表里有用户ID、状态、创建时间三个字段,查询条件是WHERE user_id = X AND status = Y ORDER BY created_at DESC。

直觉告诉我们:把过滤条件放前面,排序放最后。于是建了(user_id, status, created_at)。

但PostgreSQL的执行计划显示,它根本没走这个索引。为什么?

因为查询里status是可选参数——有时候传,有时候不传。当status没传时,索引前缀只剩user_id,后面跟着status和created_at的排序完全用不上。数据库被迫做全表扫描,或者选另一个更差的索引。

复合索引的顺序不是按"直觉重要性"排,而是按"查询条件的确定性"排。最常被用于等值查询、且几乎不会跳过的字段,才配站最前面。

我们最后把索引改成(user_id, created_at, status),配合一个部分索引处理特定状态,问题才解决。同一个查询,从2秒回到180毫秒。

覆盖索引的陷阱:省一次回表,可能赔十次写性能

另一个坑是"覆盖索引"(Covering Index,即INCLUDE索引)的滥用。

原理很简单:索引里带上查询需要的所有字段,数据库就不用回表查主数据了。读性能确实提升,但代价在写入端。

我们的表每小时新增50万行,更新频率也不低。每个INCLUDE字段都要在每次写入时维护,WAL(预写日志)膨胀、IO压力、锁竞争全来了。加索引前没算这笔账,结果读查询快了30%,写入慢了400%,整体吞吐量反而下降。

覆盖索引不是免费午餐,是读性能和写性能的交易。高频写入场景下,这个杠杆可能反向操作。

最后我们拆成了两个索引:一个轻量级的用于高频查询,另一个带INCLUDE的只在特定报表查询时启用。用部分索引(Partial Index)控制适用范围,而不是让索引扛着全表数据跑。

EXPLAIN和EXPLAIN ANALYZE,差了一个生产环境

最讽刺的是,我们一开始看过执行计划。EXPLAIN显示新索引被使用了,成本估算也很低。

但EXPLAIN只是基于统计信息的"猜测",EXPLAIN ANALYZE才是实际跑出来的真相。我们的表刚做了大批量导入,统计信息还没更新,优化器以为数据分布是A,实际是B。

这4小时里,前3小时都在跟"为什么优化器不选这个索引"较劲。直到有人跑了ANALYZE更新统计信息,再用EXPLAIN ANALYZE对比,才发现索引根本没被选中——之前的"选中"是过时统计信息制造的幻觉。

ANALYZE(统计信息更新)和EXPLAIN ANALYZE(实际执行分析),这两个命令在加索引后必须成套出现。少一个,你看到的可能是平行世界的执行计划。

索引不是越多越好,是越"被用到"越好

事后复盘,pg_stat_user_indexes(索引使用统计视图)给了我们一记耳光。那个"优化索引"在故障前的24小时内,被使用的次数是零。而另一个我们以为"可能过时"的老索引,承载了90%的查询。

PostgreSQL的优化器有自己的想法。它权衡的不仅是索引是否"理论上适用",还有缓存命中率、并发锁情况、数据相关性等一系列因素。有时候两个索引都能用,它偏偏选那个你觉得"次优"的——因为它的成本模型算出来,那个确实更便宜。

我们现在的流程:加索引前用pg_qualstats(查询条件统计)找真实的热点;加之后用EXPLAIN ANALYZE验证;上线后用pg_stat_user_indexes监控实际使用情况。30天零使用的索引,自动清理。

那个让查询慢10倍的索引?我们没删,把它改成了部分索引,只覆盖特定时间段的数据。现在它每天被用到2000次,但影响的写入开销降低了70%。

数据库优化没有银弹,只有假设、验证、再假设。你最近一次加索引后,真的看过EXPLAIN ANALYZE的Actual Time(实际耗时)吗?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
邓文迪在洛杉矶晚宴!和默多克继女达莎同台,穿透视裙状态似少女

邓文迪在洛杉矶晚宴!和默多克继女达莎同台,穿透视裙状态似少女

落雪听梅a
2026-04-18 15:54:57
“一个针头给15人采血”浙江宣传为何又默不作声?

“一个针头给15人采血”浙江宣传为何又默不作声?

清哲木观察
2026-04-19 11:14:52
他是著名演员,从发病到去世仅20分钟,主持人儿子比他更有名

他是著名演员,从发病到去世仅20分钟,主持人儿子比他更有名

削桐作琴
2026-03-21 15:03:45
冯提莫杭州古镇现身被围观,网友目测身高1米65,否认她矮

冯提莫杭州古镇现身被围观,网友目测身高1米65,否认她矮

绚丽的画卷
2026-04-18 22:40:05
突发:无线电沉默、作战部队部署表明美国将发动军事行动

突发:无线电沉默、作战部队部署表明美国将发动军事行动

深度报
2026-04-19 21:50:51
603272,致歉!或被“*ST”!

603272,致歉!或被“*ST”!

证券时报e公司
2026-04-19 16:58:40
50岁曾黎生图曝光,嘴歪脸僵肿医美明显,颜值暴跌一脸凶相太吓人

50岁曾黎生图曝光,嘴歪脸僵肿医美明显,颜值暴跌一脸凶相太吓人

谈史论天地
2026-04-19 06:18:25
母亲给儿子存钱18年,被其上交给女友,女友私下改密码,网友炸锅

母亲给儿子存钱18年,被其上交给女友,女友私下改密码,网友炸锅

鲸探所长
2026-04-18 14:44:30
女孩边玩手机边下楼梯 不慎踩空摔倒或将终身瘫痪

女孩边玩手机边下楼梯 不慎踩空摔倒或将终身瘫痪

闪电新闻
2026-04-18 22:42:07
邵佳一昨晚最大发现:毛伟杰1数据成中超前十唯一中国人!

邵佳一昨晚最大发现:毛伟杰1数据成中超前十唯一中国人!

邱泽云
2026-04-19 16:07:40
爆冷!终结15连胜,郭士强见证:山东男篮止5连败,高诗岩太尴尬

爆冷!终结15连胜,郭士强见证:山东男篮止5连败,高诗岩太尴尬

话体坛
2026-04-19 22:20:17
四川饲料大王首富变“首负”:欠了近千亿,一年光利息就要18亿

四川饲料大王首富变“首负”:欠了近千亿,一年光利息就要18亿

梦回千年aa
2026-04-12 05:53:20
灰色上衣搭配灰色休闲裤,贴身舒适,简约又时尚

灰色上衣搭配灰色休闲裤,贴身舒适,简约又时尚

只要高兴就好
2026-04-07 14:11:06
等不到特朗普访华了,美国提前对华摊牌:要求秘鲁把中国赶出港口

等不到特朗普访华了,美国提前对华摊牌:要求秘鲁把中国赶出港口

安珈使者啊
2026-04-19 11:44:14
坐拥北京一条街,丈夫是京剧名家,如今身价过亿32岁儿子却成心病

坐拥北京一条街,丈夫是京剧名家,如今身价过亿32岁儿子却成心病

不似少年游
2026-04-07 22:24:49
被coco曝三胎生父后,张柏芝带儿子露面,谢霆锋坦白不娶王菲内幕

被coco曝三胎生父后,张柏芝带儿子露面,谢霆锋坦白不娶王菲内幕

一盅情怀
2026-04-19 18:20:07
6月1日起看病大变天,3类小病不再收,社区医院成主力

6月1日起看病大变天,3类小病不再收,社区医院成主力

老特有话说
2026-04-19 15:10:09
金像奖太拉胯!李心洁深V性感,马丽遮不住肥肚,章子怡暴瘦好老

金像奖太拉胯!李心洁深V性感,马丽遮不住肥肚,章子怡暴瘦好老

杨仔述
2026-04-19 22:01:33
罗体:卢卡库预计明日回那不勒斯,他已通过经纪人告知俱乐部

罗体:卢卡库预计明日回那不勒斯,他已通过经纪人告知俱乐部

懂球帝
2026-04-19 22:16:17
无需磨合直接就打附加赛?广东宏远已出发前往客场,新外援还未飞往国内!

无需磨合直接就打附加赛?广东宏远已出发前往客场,新外援还未飞往国内!

廣東篮球掂
2026-04-19 12:56:13
2026-04-19 23:40:49
硅屿手记
硅屿手记
有态度网友ytd
2777文章数 13关注度
往期回顾 全部

科技要闻

50分26秒破人类纪录!300台机器人狂飙半马

头条要闻

半年下沉22厘米 女子家中坐拥价值上亿别墅却没法住人

头条要闻

半年下沉22厘米 女子家中坐拥价值上亿别墅却没法住人

体育要闻

湖人1比0火箭:老詹比乌度卡像教练

娱乐要闻

何润东涨粉百万!内娱隔空掀桌第一人

财经要闻

华谊兄弟,8年亏光85亿

汽车要闻

29分钟大定破万 极氪8X为什么这么多人买?

态度原创

家居
艺术
时尚
本地
游戏

家居要闻

法式线条 时光静淌

艺术要闻

拿下阿联酋高铁,中东成了中国基建的“第二主场”!

装修“精神角落”,就是这么上瘾

本地新闻

12吨巧克力有难,全网化身超级侦探添乱

如何将ZH-1火力最大化?《战舰世界》15.3版本造船厂加点攻略

无障碍浏览 进入关怀版