首页 > 解决方案 > PostgreSQL覆盖索引和主键

问题描述

我在文档中找不到它,但我应该将表的主键包含在覆盖索引中吗?

查询(简化):SELECT id, y FROM table WHERE x=5

指数:CREATE INDEX idx_1 ON table(x) INCLUDE(id, y)还是只是... INCLUDE(y)

标签: postgresqlindexing

解决方案


在 PostgreSQL 中,自动包含在指向表行的索引中的东西是称为“ctid”的系统列。主键不会自动包含在索引中,因此如果要包含它,则需要指定它。

但是没有理由将它包含在 INCLUDE 中,而只是将其直接放入索引主列列表中CREATE INDEX idx_1 ON table(x, y, id)。使用 INCLUDE 的原因是,如果您希望索引在列列表的某些前缀上是唯一的,或者列是不支持排序运算符的类型,因此不能在 btree 的主列列表中指数。


推荐阅读