如果存在多个索引,Postgres 如何选择使用哪个索引?

How does Postgres choos which index to use in case if multiple indexes are present?

我是 Postgres 的新手,如果我有多个如下定义的 btree 索引,我对 Postgres 如何决定使用哪个索引有点困惑。

CREATE INDEX index_1 ON sample_table USING btree (col1, col2, COALESCE(col3, 'col3'::text));

CREATE INDEX index_2 ON sample_table USING btree (col1, COALESCE(col3, 'col3'::text));

当我写入 sample_table(来自源表)时,我在连接条件中使用 col1, col2, COALESCE(col3, 'col3'::text) 但当我进行解释分析时为了获得查询计划,我有时会看到它使用 index_2 进行扫描而不是 index_1 ,有时只是使用顺序扫描。我想了解是什么让 Postgres 使用一个索引而不是另一个索引?

没有看到 EXPLAIN (ANALYZE, BUFFERS) 输出,我只能给出一个笼统的答案。

PostgreSQL 会考虑所有可行的执行计划,并估算每个节点的行数和成本。然后它采用成本估算最低的计划。

可能是 col2 上的条件有时更具选择性,有时则更少,例如,因为您有时将其与稀有值进行比较,有时将其与频繁值进行比较。如果涉及 col2 的条件不是选择性的,则使用两个索引中的哪一个并不重要。在这种情况下,PostgreSQL 更喜欢较小的 two-column 索引。