Friends带有以下索引的表:
Friends ( user_id1 ,user_id2)
复制
user_id1和user_id2是user表的外键。
这些是等价的吗?如果不是,那为什么?
Index(user_id1,user_id2) and Index(user_id2,user_id1)
复制
这些不是等价的,一般来说 index(bar,baz) 对表单的查询效率不高 select * from foo where baz=?
这样的索引确实可以加快查询速度,但这种效果是有限的,并且通常期望索引改进查找的顺序不同 - 它依赖于这样一个事实,即索引的“完整扫描”通常是由于表中没有出现在索引中的额外列,因此比索引表的“完全扫描”更快。
试验台:
查询 1(无索引,达到74 个缓冲区):
查询 2(使用索引 - 优化器忽略索引 -再次命中74 个缓冲区):
查询 3(使用索引 - 欺骗优化器使用它):
因此,在这种情况下,通过索引的访问速度是30 个缓冲区的两倍——就索引而言,“稍微快一点”!,YMMV 取决于表和索引的相对大小,以及过滤的行数和集群特征表中的数据,相比之下,前导列上的查询使用索引的 btree 结构 - 在这种情况下会命中2 个缓冲区:
结 论:
多列索引可用于非前导列上的查询,但对于选择性条件(结果中的行的百分比很小),加速仅约为 3 倍。较大的元组较高,结果集中表的较大部分较低。
如果性能很重要,则在这些列上创建一个额外的索引。
如果所有涉及的列都包含在索引(覆盖索引)中,并且所有涉及的行(每个块)对所有事务都是可见的,在 pg 9.2 或更高版本中获得“仅索引扫描”。

本文作者:胡祥开(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
9.9 分高危漏洞,尽快升级到 pgAdmin 4 v9.2 进行修复
严少安
335次阅读
2025-04-11 10:43:23
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
320次阅读
2025-04-15 14:48:05
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
272次阅读
2025-04-07 12:14:29
云和恩墨钟浪峰:安全生产系列之SQL优化安全操作
墨天轮编辑部
225次阅读
2025-03-31 11:08:20
postgresql+patroni+etcd高可用安装
necessary
150次阅读
2025-03-28 10:11:23
手把手教你在 openKylin 上部署 IvorySQL 4.4
严少安
141次阅读
2025-03-27 20:41:28
转发有奖 | PostgreSQL 16 PGCM高级认证课程直播班招生中!
墨天轮小教习
140次阅读
2025-04-14 15:58:34
从 Oracle 到 PostgreSQL迁移成本评估揭秘
梧桐
140次阅读
2025-03-27 17:21:42
从Percona 发布Pro级产品得到的一些启发
库海无涯
118次阅读
2025-03-26 08:45:23
外国CTO也感兴趣的开源数据库项目——openHalo
小满未满、
117次阅读
2025-04-21 16:58:09