同一个表的同一列上的2个PostgreSQL索引 - 冗余?

Hen*_*hiu 6 sql database postgresql indexing

我有一个带有2个索引的PostgreSQL表.其中一个索引是覆盖website_idtweet_id列,是一个独特的B树索引.第二个索引仅覆盖website_id列,并且是非唯一索引.

如果第一个索引存在,第二个索引是多余的吗?换句话说,拥有第二个指数是否没有优势?

Mar*_*nen 9

postgres多列索引可用于仅搜索第一列,因此在实践中它是多余的.

多列B树索引可以与涉及索引列的任何子集的查询条件一起使用,但是当前导(最左侧)列存在约束时,索引最有效.确切的规则是对前导列的等式约束以及第一列上没有等式约束的任何不等式约束将用于限制扫描的索引部分.

Postgres 9.2文档

有一个远程情况,其他索引可能是有用的(见下面更详细的东西),即.如果您对第一个索引执行大多数查询,并且索引具有非常小的缓存.在这种情况下,组合索引可能不适合缓存,但是较小的单列可能适合缓存.

https://dba.stackexchange.com/questions/27481/is-a-composite-index-also-good-for-queries-on-the-first-field/27493#27493


Erw*_*ter 6

这取决于.

假设我们只讨论默认的B-Tree索引.如果涉及其他索引类型,如GINGiST,事情并不那么简单.

原则(a,b)a,索引对于just (a)而不是另一个索引是有益的.(但是一个额外的索引(b)通常是有意义的!)如果列很大,那么
可能仍然是一个好主意b,因此just上的索引(a)要小得多.

您将不得不考虑表的大小,可用RAM,典型查询,涉及的数据类型,索引的大小,每个元组的开销和数据大小,数据对齐和填充 ...或者只是用您的实际运行测试数据和查询(但要小心你正在测试的内容).

例如,如果ab不超过4个字节(大integer,smallint,date,...)上的索引(a,b)是完全一样大的作为只是一个(a)并没有任何点,以保持第二.

在dba.SE更详细的答案这种情况下究竟.

Postgres 当前版本手册始终是获取更多详细信息的良好来源.