PostgreSQL教程

PostgreSQL 多列索引

在本节中,我们将了解 PostgreSQL多列索引的创建,并且这些索引是在

什么是PostgreSQL多列索引?

我们可以在表的各个列上创建索引。这样的索引称为多列索引。
换句话说,我们可以说多列索引是那些索引,是用表的几列创建的。
多列索引也称为复合索引,串联索引和组合索引。
表中最多可以包含最多32列列。在构建 PostgreSQL 时,可以通过修改 pg_config_manual.h 来更改该限制。
此外,多列索引仅支持 B树,GIST,GIN和BRIN 类型的索引。

PostgreSQL Multi的语法-列索引

PostgreSQL多列索引的语法如下:
CREATE INDEX index_name  
ON table_name (p, q,r,….);
注意: 在以上语法中,p,q,r被视为列名。
如果要指定多列索引,则应频繁放置 WHERE 子句(位于列列表的开头),以及在其后的条件中重复使用的列。
在上图中,我们有在以下情况下, PostgreSQL优化器将考虑使用索引:
WHERE p = value1 and q = value2 and r = value3;
WHERE p = value1 and q = value2;
WHERE p = value1;
但是,在以下情况下,我们将不使用索引:
WHERE r = value3;
WHERE q = value2 and r = value3;

PostgreSQL多列索引示例

要了解 PostgreSQL多列索引的工作原理,我们将看到以下示例。
因此,我们将在 CREATE 命令的帮助下创建一个新表作为 Person 使用 INSERT 命令的值。
要创建将 Person 表插入组织数据库,我们使用 CREATE 命令。
Person 表包含各种列,例如 Person_id,First_name,Last_name 列,其中我们将 Person_id 用作 GENERATED ALWAYS AS IDENTITY约束。
CREATE TABLE Person(
    Person_id int GENERATED BY default AS IDENTITY,
    first_name VARCHAR(30) NOT null,
    last_name VARCHAR(30) NOT null
);
输出
在执行上述命令时,我们将得到以下消息,该消息显示 Person 表已成功创建到 Organization 数据库中。
PoatgreSQL 多列索引
成功创建 Person 表后,我们将在 INSERT 命令的帮助下向其中输入一些值。
INSERT INTO Person (First_name, Last_name)
VALUES ('Mike', 'Ross'),
('John','Smith),
('Owen','Norman'),
('Bruce','Willis'),
('Douglas','Smith'),
('Olivia', 'Smith');
输出
在执行上述命令时,我们将获得以下消息窗口,该窗口显示指定的值已成功插入人员 表。
PoatgreSQL多列索引
在 人员 表中创建并插入值之后,我们将识别姓氏为史密斯的那些人,如以下命令所示:
SELECT *
FROM Person
WHERE last_name = 'Smith';
输出
执行上述命令后,我们将获得以下输出,其中显示了所有人,其姓氏属于 Smith。
PoatgreSQL多列索引
在以下命令中,我们将使用 EXPLAIN 命令对 Person 进行顺序扫描 >表,这可以帮助我们识别等效行,因为没有为 last_name 列定义索引。
EXPLAIN
SELECT *
FROM Person
WHERE last_name = 'Smith';
输出
成功执行以上命令后,我们将获得以下结果,显示PostgreSQL已完成对 Person的顺序扫描 表。
PoatgreSQL多列索引">
目前,则多列索引仅支持 B树,GiST,GIN和BRIN 索引类型。

带有B树索引的PostgreSQL多列索引

在下面的命令中,我们在 first_name和last_name 列上都定义了 B树索引。
让我们假设我们使用姓氏搜索该人的频率要比按其姓氏搜索的频率高。
因此,在以下命令中,我们在下面的列中指定索引订单:
CREATE INDEX idex_person_names 
ON Person (last_name, first_name);
输出
执行上述命令后,我们将获得以下输出,该输出显示 Idex_person_names 索引已成功创建 Person 表。
PoatgreSQL Multi-column indexes
如果我们搜索姓为 Smith 的人,则PostgreSQL优化器将使用该索引,如以下命令所示:
EXPLAIN 
SELECT *
FROM Person
WHERE last_name = 'Smith';
输出
执行上述命令后,我们将获得以下输出:
PoatgreSQL Multi-column Indexes
在上面的屏幕截图中,我们将看到 QUERY PLAN 仅使用顺序扫描,而不是索引,因为表中没有足够的数据供计划人员使用索引。
因此,要查看特定表的索引,我们必须使用以下命令:
 SET enable_seqscan = off;
输出
执行上述命令后,我们将获得以下消息窗口: 该命令已成功设置。
PoatgreSQL多列索引
执行 SET 命令后,我们将执行再次使用EXPLAIN 命令,我们将获得以下输出,该显示在查询计划中的索引:
PoatgreSQL多列索引
在下一个命令中,我们将识别姓为 Smith 和名称是 John :
SELECT *
FROM Person
WHERE last_name = 'Smith'
AND first_name = 'John';
输出
执行上述命令时,我们将收到以下消息,该消息显示名字为 John的人员和姓氏是 Smith :
PoatgreSQL多列索引
此后,PostgreSQL Optimizer在 WHERE 中将上述命令的索引用作两个列( first_name和last_name ) >子句属于索引:
EXPLAIN
SELECT *
FROM Person
WHERE last_name = 'Smith'
AND first_name = 'John';
输出
执行上述命令后,我们将得到以下结果: PostgreSQL优化程序将索引用于 first_name和last_name Person 表的列。
PoatgreSQL多列索引
但是,如果我们搜索名字为 John 的人员,则PostgreSQL将对该表执行顺序扫描而不是使用以下命令中所示的索引:
EXPLAIN
SELECT *
FROM Person
WHERE first_name = 'John';
输出
执行上述命令后,我们将获得以下输出,该输出显示PostgreSQL优化器执行了特定表的顺序扫描。
PoatgreSQL多列索引
注意: 即使first_name列与索引相关,PostgreSQL也无法强制使用它。

带有GIN索引的PostgreSQL多列索引

PostgreSQL多列 GIN索引可以用于查询设置,包括索引列的任何子集。 与 B树或GiS T不同,索引搜索效率相似,并且与查询条件所使用的索引列无关。

带有GiST索引的PostgreSQL多列索引

PostgreSQL多列GiST索引还与查询条件结合在一起,查询条件包含索引列的任何子集。 其他列上的条件检查索引检索的条目。 要定义要扫描多少索引,第一列中的条件应为主要条件。 如果其第一列仅包含一个有限的不同值,即使其他列中存在多个不同的值,则 GiST索引相对不会成功。

带有BRIN索引的PostgreSQL多列索引

PostgreSQL多列 BRIN索引可以与查询条件一起使用,查询条件包含索引列的任何子类别。 与 GIN 类似,与 B树或GiST 不同,索引搜索效率相似,并且与查询条件所使用的索引列无关。 最重要的目的之一是对单个表采用多个 BRIN索引,而不是一个多列BRIN索引是要具有不同的 page_per_range 存储约束。
注意: 当我们指定多列索引时,我们应始终使用业务环境来识别经常用于查找的列,并在指定列列表的开头使用它们指数。

概述

在本节中,我们了解了PostgreSQL多列索引和列顺序的重要性。 PostgreSQL多列索引可以谨慎使用。在大多数情况下,单列索引就足够了,并且可以节省空间和时间。 我们还了解到PostgreSQL多列索引只能支持 B树,GiST,GIN和BRIN 类型的索引。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4