如何在PostgreSQL数据库中创建索引
建站教程 2021-03-17 09:17 2971

索引是数据库搜索引擎用来加速查询结果的专用检索表。索引是对表格中信息的参考。例如,如果通讯录中的姓名不是按字母顺序排列的,那么你就必须每一行都往下查,查遍每一个名字,才能查到你要搜索的特定电话号码。索引可以加快SELECT命令和WHERE短语的速度,执行UPDATE和INSERT命令的数据输入。无论插入或删除索引,都不会对表内的信息产生影响。索引可以是特殊的,就像UNIQUE限制有助于避免索引存在的字段或字段集中出现重复记录一样。

一般语法

以下通用语法用于创建索引。

>> CREATE INDEX index_name ON table_name (column_name);

要开始使用索引,请从应用程序栏中打开Postgresql的pgAdmin。您会在下面看到“Servers”选项。右键单击该选项,然后将其连接到数据库。

如你所见,数据库"Test "被列在 "Databases "选项中。如果你没有数据库,请右击'Databases',导航到'Create'创建选项,并根据你的喜好命名数据库。

展开'Schemas'选项,你会发现那里列出了'Tables'选项。如果你没有表,右键点击它,导航到'Create'创建,然后点击'Table'表选项来创建一个新表。我这里已经创建了'emp'表,你可以在列表中看到它。

试着在查询编辑器中进行SELECT查询,获取'emp'表的记录,如下所示。

>> SELECT * FROM public.emp ORDER BY “id” ASC;

以下数据将出现在 "emp "表中。

创建单列索引

展开'emp'表,找到各种类别,例如,列、约束、索引等。右键点击'Indexes'索引,导航到'Create'创建选项,然后点击'Index'来创建一个新的索引。

使用索引对话框为给定的 "emp "表或偶数显示构建一个索引,这里有两个标签:"常规 "和 "定义"。这里有两个标签:"General(常规)"和 "Definition(自定义)"。在 "General"常规选项卡中,在 "Name"名称 字段中为新索引插入一个特定的标题。使用'Tablespace'旁边的下拉列表,选择新索引将存储在其下的'Tablespace'。 与'Comment'注释区域一样,在这里进行索引注释。要开始这个过程,请导航到'Definition'定义选项卡。

在这里,通过选择索引类型来指定'Access Method'访问方法。之后,要将索引创建为'Unique',那里还列出了其他几个选项。在 "Columns"列区域,点击 "+"号,添加用于索引的列名。正如你所看到的,我们只对 "Phone"电话列应用了索引。开始,选择SQL部分。

SQL选项卡显示了在整个索引对话中由您的输入创建的SQL命令。点击 "Save"保存按钮来创建索引。

再次进入"Tables"表选项,并导航到 "emp "表。刷新"Indexes"索引选项,你会发现新创建的 "index_on_phone "索引就在其中。

现在,我们将执行EXPLAIN SELECT命令来检查带有WHERE子句的索引的结果。这将导致以下输出,即Semp Scan on emp. 你可能会奇怪为什么在使用索引的时候会发生这种情况。

原因:Postgres计划者可以出于各种原因决定不使用索引。战略家在大多数时间都会做出最佳决策,即使原因并不总是很清楚。如果在某些查询中使用索引搜索,但不是在所有查询中都使用索引搜索,那是很好的。从任一表返回的条目可能会有所不同,具体取决于查询返回的固定值。因为发生这种情况,所以序列扫描几乎总是比索引扫描更快,这表明查询计划者可能正确地确定了以这种方式运行查询的成本已降低。

创建多个列索引

要创建多列索引,请打开命令行shell并考虑下表“ student”以开始处理具有多列的索引。

>> SELECT * FROM Student;

在其中编写以下CREATE INDEX查询。该查询将在“学生”表的“名称”和“年龄”列中创建一个名为“ new_index”的索引。

>> CREATE INDEX new_index ON Student (sname, age);

现在,我们将使用'\ d'命令列出新创建的'new_index'索引的属性和属性。如您在图片中所看到的,这是一个btree类型的索引,已应用于'sname'和'age'列。

>> \d new_index;

创建唯一索引

要构建唯一索引,请假定以下“ emp”表。

>> SELECT * FROM emp;

在shell程序中执行CREATE UNIQUE INDEX查询,然后在“ emp”表的“ name”列中执行索引名称“ empind”。在输出中,您可以看到唯一索引无法应用于具有重复的“名称”值的列。

>> CREATE unique INDEX empind ON emp (name);

确保将唯一索引仅应用于不包含重复项的列。对于“ emp”表,您可以假设只有“ id”列包含唯一值。因此,我们将对其应用唯一索引。

>> CREATE unique INDEX empind ON emp (id);

以下是唯一索引的属性。

>> \ d empid ;

DROP语句用于从表中删除索引。

>> DROP INDEX empind;

总结

虽然索引旨在提高数据库的效率,但在某些情况下,无法使用索引。使用索引时,必须考虑以下规则:

小型表不应删除索引。

具有大量大规模批处理表的升级/更新或添加/插入操作。

对于包含大量NULL值的列,索引不能是混杂的-

销售。

应避免使用定期操作的列进行索引。

标签:

  • PostgreSQL