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

时间:2013-07-04 23:50:51

标签: sql database postgresql indexing

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

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

3 个答案:

答案 0 :(得分:9)

postgres多列索引只能用于搜索第一列,因此在实践中它是多余的。

  

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

Postgres 9.2 documentation

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

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

答案 1 :(得分:6)

取决于。

假设我们只讨论默认的B-Tree索引。如果涉及其他索引类型,例如GINGiST,则事情并非如此简单。

原则上,(a,b)上的索引仅适用于a上的搜索,而不需要(a)上的另一个索引。 (But an additional index on just (b) generally makes sense!
如果列b很大,那么可能仍然是一个好主意,因此(a)上的索引要小得多。

您必须考虑表的大小,可用RAM,典型查询,涉及的数据类型,索引的大小,每个元组的开销和数据大小,data alignment and padding ...或者只是运行使用您的实际数据和查询进行测试(但要小心您正在测试的内容)。

例如,如果ab不超过4个字节(integersmallintdate,...){ {1}}与(a,b)上的{1}}一样大,并且没有任何意义可以保留第二个。

A more detailed answer on dba.SE for this case exactly.

manual for the current version of Postgres始终是获取更详细信息的良好来源。

答案 2 :(得分:1)

是的,它是(多余的)。

复合索引行为不仅适用于Postgres,也适用于任何其他RDBMS。