📜  PostgreSQL创建索引

📅  最后修改于: 2020-11-30 09:34:52             🧑  作者: Mango

PostgreSQL创建索引

在本节中,我们将了解PostgreSQL创建索引的工作以及创建索引命令的示例

为什么我们使用PostgreSQL创建索引命令?

PostgreSQL中,“创建索引”命令用于通过定义索引名称以及在其上创建索引的表或列名称来创建新索引。

PostgreSQL Create Indexes命令的语法

创建索引命令的语法如下:

CREATE INDEX index_name ON table_name [USING method]
(
    column_name [ASC | DESC] [NULLS {FIRST | LAST}],
    ...
);

在上面的语法中,我们使用了以下参数,如下表所示:

Parameters Description
Index_name
  • It is used to define the name of the index.
  • And it should be written after the CREATE INDEX
  • Here, we should try to give the easier and significant name of the index, which can be easily recalled.
Table_name
  • The table_name parameter is used to define the table name, which is linked with the Indexes.
  • And it is specified after the ON keyword.
Using[method]
  • It is used to specify the index methods, such as B-tree, GIN, HASH, GiST, BRIN, and SP-GiST.
  • By default, PostgreSQL uses B-tree Index.
Column_name
  • The column_name parameter is used to define the list if we have several columns stored in the index.
  • The ASC and DESCare used to define the sort order. And by default, it is ASC.
  • The NULLS FIRST or NULLS LASTis used to describe the nulls sort before or after non-null values.
  • When DESCis defined, then the NULLS FIRST is considered as the default.
  • And when DESC is not defined, then NULLS LAST is considered as default.

注意:如果要确定命令是否使用索引,可以使用EXPLAIN命令。

PostgreSQL创建索引的示例

让我们看一个示例示例,以了解PostgreSQL CREATE Indexes命令的工作。

但是在讨论示例之前,我们将把索引和电话目录类比作为示例的一部分。

索引和电话目录类比

为了理解索引和电话目录类比的实例,我们有以下几种情况:

情况1:如果电话簿按字母顺序排列。

  • 假设我们需要看到在电话簿麦克·泰勒电话号码
  • 我们也知道电话目录中的名称是按字母顺序排列的。
  • 因此,首先,我们将检查那些姓氏Taylor的页面,确定名字Mike的页面,最后检索他的电话号码

情况2:如果电话簿不是按字母顺序排列的。

  • 假设电话簿上的名称不是按字母顺序排列的。
  • 因此,我们必须检查所有页面,例如检查所有名称,直到我们确定Mike Taylor的电话号码为止。
  • 这个过程称为顺序扫描,它将遍历所有条目,直到我们确定要搜索的条目为止。

注意:

与电话号码簿平行的是,可以按照特定的顺序准备表中存储的数据,以加快搜索速度;因此,我们使用了索引。

索引可以被视为诸如B-Tree之类的数据结构,它以进一步写入和存储以保持该数据为代价,提高了对表进行数据检索的速度。

我们将使用在PostgreSQL教程的前面部分中创建的Person_detalis表。

Person_deatils表包含各种列,例如id,Person_name和Mobile_number,如以下屏幕快照所示:

在以下命令中,我们将尝试识别Mobile_number为(444)-333-1234的人员名称:

SELECT * FROM Person_details
WHERE Mobile_number = '{(444)-333-1234}';

输出量

在执行上面的命令,我们会得到下面的输出,我们成功地找出那个人的名字,其手机号码为(444)-333-1234,这是麦克·泰勒

可以理解,数据库必须扫描完整的Person_details表以标识Person_name,因为Mobile_number列没有索引。

在这里,我们可以使用EXPLAIN命令查看查询计划,如下面的命令所示:

EXPLAIN SELECT *
FROM Person_details
WHERE Mobile_number = '{(444)-333-1234}';

输出量

执行上述命令后,我们将获得以下输出,该输出显示Person_details的查询计划。

现在创建一个新索引,借助以下命令,从“人员”详细信息表的Moblie_phone列中获取值:

CREATE INDEX idx_Person_details_Mobile 
ON Person_details(Mobile_number);

输出量

执行上述命令后,我们将收到以下消息: idx_Person_details_Mobile索引已成功创建。

如果我们要标识包含查找索引的数据库引擎,则可以再次使用上面的Explain命令,如以下命令所示:

EXPLAIN SELECT *
FROM Person_details
WHERE Mobile_number = '{(444)-333-1234}';

输出量

执行上述命令后,我们将获得以下消息,其中显示了Person_details表的查询计划。

总览

在PostgreSQL中,我们具有Single-index列索引,它可以帮助我们增强PostgreSQL索引的性能。

在“ PostgreSQL创建索引”部分中,我们学习了以下主题:

  • 我们已使用CREATE Index命令为特定表创建新索引。