PostgreSQL - 它会在同一个表上使用两个索引吗?

Jes*_*ens 2 postgresql indexing

假设您有一个包含一些索引的表:

create table mail
(
    identifier serial primary key,
    member text,
    read boolean
);

create index on mail(member_identifier);
create index on mail(read);
Run Code Online (Sandbox Code Playgroud)

如果您现在查询具有单独索引的多个列,它是否会使用这两个索引?

select * from mail where member = 'Jess' and read = false;
Run Code Online (Sandbox Code Playgroud)

也就是说,PostgreSQL可以决定首先使用索引member来获取Jess的所有邮件,然后使用索引read来获取所有未读邮件,然后将两个结果相交以构造输出集吗?

我知道你可以拥有一个包含多列的索引((member, read)在本例中为on ),但是如果你有两个单独的索引会发生什么?PostgreSQL会选择一个还是在某些情况下可以同时使用它们?

这不是关于特定查询的问题.理解内部结构是一个普遍的问题.

Dyl*_*ams 5

Postgres有关多个查询索引的文档

文章说它将创建两个索引适用的位置的抽象表示然后结合结果.

为了组合多个索引,系统扫描每个所需的索引并在内存中准备一个位图,给出报告为与索引条件匹配的表行的位置.然后根据查询的需要对位图进行AND运算和OR运算.最后,访问并返回实际的表行.