PostgreSQL Create Index创建索引

在本节中,我们将了解PostgreSQL Create Index的工作原理和Create indexes 命令的示例。

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

PostgreSQL中,创建索引命令用于通过定义索引名称和创建索引的表或列名称来创建新索引。

PostgreSQL 创建索引命令的语法

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

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

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

参数 描述
Index_name
  • 它用于定义索引的名称。
  • 而且应该写在CREATE INDEX之后
  • 在这里,我们应该尽量给索引起一个更简单、更显着、容易记忆的名字。
Table_name
  • table_name参数用于定义表名,与Indexes关联。
  • 它在ON关键字之后指定。
Using[method]
  • 用于指定索引方法,如B-tree、GIN、HASH、GiST、BRIN、SP-GiST。
  • 默认情况下,PostgreSQL 使用B 树索引。
Column_name
  • 如果我们在索引中存储了多个列,则column_name参数用于定义列表。
  • ASC和DESC用于定义排序顺序。默认情况下,它是ASC。
  • NULLS FIRST 或 NULLS LAST用于描述非空值之前或之后的空值排序。
  • 当定义了DESC时,NULLS FIRST被认为是默认值。
  • 当未定义DESC时,则NULLS LAST被视为默认值。

PostgreSQL Create Index创建索引示例

让我们看一个示例来了解PostgreSQL CREATE Indexes命令的工作原理。

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

索引和电话目录类比

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

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

  • 假设我们需要在电话簿中查看Mike Taylor的电话号码。
  • 众所周知,电话簿中的姓名是按字母顺序排列的。
  • 因此,首先,我们将检查那些姓氏为Taylor的页面,识别出名字为Mike的页面,最后检索他的电话号码。

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

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

注意事项:

与电话簿并行,表中存储的数据可以按特定顺序准备,以加速多次搜索;因此,我们使用了索引。

索引可以被认为是一种数据结构,例如B-Tree,它以进一步写入和存储为代价提高了表上数据检索的速率。

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的人名,即Mike Taylor。

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

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

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

执行上述命令后,我们将得到如下输出,其中显示了Person_details表的查询计划。

现在为了创建一个新索引,我们借助以下命令从Person 详细信息表的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表的查询计划。

 

热门文章

优秀文章