# 11.1.导言

假设我们有一张类似的桌子:

CREATE TABLE test1 (
    id integer,
    content varchar
);

应用程序会对表单发出许多查询:

SELECT content FROM test1 WHERE id = constant;

如果没有预先准备,系统将不得不扫描整个系统测试1表,逐行查找所有匹配项。如果有很多行测试1而且这种查询只会返回几行(可能是零行或一行),这显然是一种低效的方法。但如果系统被指示在身份证件列,它可以使用更有效的方法来定位匹配的行。例如,它可能只需要深入搜索树几层。

在大多数非小说类书籍中也使用了类似的方法:读者经常查阅的术语和概念被收集在书尾的字母索引中。感兴趣的读者可以相对快速地浏览索引并翻到适当的页面,而不必阅读整本书来找到感兴趣的材料。正如作者的任务是预测读者可能会查找的项目一样,数据库程序员的任务是预测哪些索引将是有用的。

以下命令可用于在上创建索引身份证件专栏,如前所述:

CREATE INDEX test1_id_index ON test1 (id);

名字test1_id_索引可以自由选择,但你应该选择一些能让你以后记住索引的内容。

要删除索引,请使用下降指数命令索引可以随时添加到表中或从表中删除。

一旦创建了索引,就不需要进一步的干预:系统将在修改表时更新索引,并在认为这样做比顺序表扫描更有效时在查询中使用索引。但你可能必须运行分析命令定期更新统计信息,以便查询计划人员做出明智的决策。看见第14章获取有关如何确定是否使用索引以及规划者可能选择的时间和原因的信息使用索引。

索引也可以从中受益使现代化删去具有搜索条件的命令。此外,索引还可以用于连接搜索。因此,在作为连接条件一部分的列上定义的索引也可以显著加快使用连接的查询。

在大表上创建索引可能需要很长时间。默认情况下,PostgreSQL允许读取(选择语句)在创建索引的同时出现在表上,但(插入, 使现代化, 删去)将被阻止,直到索引生成完成。在生产环境中,这通常是不可接受的。允许写操作与索引创建并行进行是可能的,但有几个注意事项需要注意——有关更多信息,请参阅建筑索引.

创建索引后,系统必须使其与表保持同步。这增加了数据操作的开销。因此,应该删除查询中很少使用或从未使用的索引。