我有一个带有 2 个索引的 PostgreSQL 表。其中一个索引覆盖了website_id
和tweet_id
列,并且是唯一的 B 树索引。第二个索引仅覆盖website_id
列,并且是非唯一索引。
如果第一个索引存在,第二个索引是否多余?换句话说,拥有第二个索引会没有优势吗?
我有一个带有 2 个索引的 PostgreSQL 表。其中一个索引覆盖了website_id
和tweet_id
列,并且是唯一的 B 树索引。第二个索引仅覆盖website_id
列,并且是非唯一索引。
如果第一个索引存在,第二个索引是否多余?换句话说,拥有第二个索引会没有优势吗?
postgres 多列索引只能用于搜索第一列,因此在实践中它是多余的。
多列 B 树索引可用于涉及索引列的任何子集的查询条件,但当前导(最左侧)列存在约束时,索引效率最高。确切的规则是前导列上的等式约束,加上没有等式约束的第一列上的任何不等式约束,将用于限制扫描的索引部分。
有一个偏远的情况,其他索引可能有用(有关更多详细信息,请参见下文),即。如果您在第一个索引上执行大部分查询并且有一个非常小的缓存可用于索引。在这种情况下,组合索引可能不适合缓存,但较小的单列可以。
这取决于。
假设我们只讨论默认的 B-Tree 索引。如果涉及到GIN或GiST等其他索引类型,事情就不那么简单了。
原则上,一个索引(a,b)
适用于对 just 的搜索,并且不需要a
另一个关于 just 的索引。(a)
(但是在 just 上的附加索引(b)
通常是有意义的!)如果列很大,那么在 just 上的索引要小得多,
这仍然是一个好主意。b
(a)
您必须考虑表的大小、可用 RAM、典型查询、所涉及的数据类型、索引的大小、每个元组的开销和数据的大小、数据对齐和填充......或者只是用您的实际运行测试数据和查询(但要小心你真正测试的内容)。
例如,如果a
andb
不大于 4 个字节(integer
, smallint
, date
, ...),则索引上的索引与(a,b)
just 上的索引完全相同,(a)
并且没有任何意义来保留第二个字节。
当前版本的 Postgres的手册始终是获取更多详细信息的好来源。
是的,它是(冗余的)。
复合索引行为不仅适用于 Postgres,而且适用于几乎所有其他 RDBMS。