📜  PostgreSQL – 多列索引

📅  最后修改于: 2022-05-13 01:57:15.567000             🧑  作者: Mango

PostgreSQL – 多列索引

在 PostgreSQL 中,多列索引是在表的多列上定义的索引。

您可以在表的多个列上创建索引。此索引称为多列索引、复合索引、组合索引或串联索引。一个多列索引最多可以有 32 个表列。可以通过在构建 PostgreSQL 时修改 pg_config_manual.h来更改限制。此外,只有 B-tree、GIST、GIN 和 BRIN 索引类型支持多列索引。

以下语法显示了如何创建多列索引:

Syntax: 
CREATE INDEX index_name
ON table_name(a, b, c, ...);

定义多列索引时,应将 WHERE 子句中经常使用的列放在列列表的开头,将不太常用的列放在后面的条件中。

上述语法中,PostgreSQL优化器在以下情况下会考虑使用索引:



WHERE a = v1 and b = v2 and c = v3;

或者,

WHERE a = v1 and b = v2;

或者,

WHERE a = v1;

但是,在以下情况下不会考虑使用索引:

WHERE  c = v3;

或者,

WHERE b = v2 and c = v3;

例子:

为了演示多列索引,我们将创建一个名为people的新表,其中包含三列:id、名字和姓氏:

CREATE TABLE people(
    id INT GENERATED BY DEFAULT AS IDENTITY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL
);

您可以通过此文件向人员添加数据。

以下语句查找姓氏为Adams 的人



SELECT
    *
FROM
    people
WHERE
    last_name = 'Adams';

这将导致以下结果:

如输出所示,PostgreSQL 对people表执行顺序扫描以查找相应的行,因为没有为 last_name 列定义索引。

让我们在 last_name 和 first_name 列上定义一个 B 树索引。假设按姓氏搜索人比按名字搜索人的频率更高,我们使用以下列顺序定义索引:

CREATE INDEX idx_people_names 
ON people (last_name, first_name);

现在,如果您搜索姓氏为Adams 的人,PostgreSQL 优化器将使用索引,如以下语句的输出所示:

EXPLAIN SELECT
    *
FROM
    people
WHERE
    last_name = 'Adams';

这将输出以下内容:

以下语句查找姓氏为Adams且名字为Lou 的人:

SELECT
    *
FROM
    people
WHERE
    last_name = 'Adams'
AND first_name = 'Lou';

这将导致以下情况:

PostgreSQL 优化器为这条语句使用了索引,因为WHERE子句中的两列都在索引中:

EXPLAIN SELECT
    *
FROM
    people
WHERE
    last_name = 'Adams'
AND first_name = 'Lou';

但是,如果您搜索名字为Lou 的人,PostgreSQL 将执行顺序扫描表而不是使用索引,如以下语句的输出所示:

EXPLAIN SELECT
    *
FROM
    people
WHERE
    first_name = 'Lou';

输出: