介绍:
加速搜索引擎检索数据的一种特殊表结构,一个数据库的索引与一本书的索引目录非常相似。
作用:
索引有助于加快select查询和where子句,但是它会减慢使用update和insert语句时的操作。索引可以创建和删除,但是不影响数据。
假设我们有一个类似这样的表:
CREATE TABLE test1 ( id integer, content varchar );
应用程序发出许多类似以下的这种查询:
SELECT content FROM test1 WHERE id = constant;
没有提前的准备,系统将不得不逐行扫描整个test1表,以查找所有匹配的条目。如果test1中有很多行,并且这样的查询仅仅返回几行(可能是零或一行),这显然是一种低效的方法。但是如果系统已被指示在id列上维护索引,则可以使用更有效的方法来定位匹配的行。例如,它可能只需要在搜索树中深入几层。
大多数非小说类书中都使用类似的方法:读者经常查阅的术语和概念在本书末尾以字母索引的形式收集。感兴趣的读者可以相对快速地扫描索引并翻转到适当的页面,而不必阅读整本书以找到感兴趣的材料。正如作者的任务是预测读者可能会查找的项目,数据库程序员的任务是预见哪些索引将是有用的。
可以使用下边的命令可以在id列上创建一个索引:
CREATE INDEX test1_id_index ON test1 (id);
名称test1_id_index可以自由选择,但您应该选择一些可以让您记住索引的内容的名称。
要删除索引,请使用DROP INDEX命令。索引可以随时添加到表中并从表中删除。
一旦创建了索引,就不需要进一步的干预:当表被修改时,系统将更新索引,当planner认为使用索引比顺序的表扫描更有效的时候,它会使用索引。但是,您可能需要定期运行ANALYZE命令来更新统计信息,以允许查询计划者做出有根据的决策。有关如何确定索引是否被使用以及计划者何时以及为什么选择不使用索引的信息,请参阅第14章。
具有搜索条件的UPDATE和DELETE命令的查询条件也可以使用索引来优化。索引也可以用于连接搜索。因此,在作为连接条件一部分的列上定义的索引也可以显著加快使用连接的查询。
在大型表上创建索引可能需要很长时间。默认情况下,PostgreSQL允许读表(SELECT语句)与索引创建并行发生,但写入(INSERT,UPDATE,DELETE)将被阻止,直到索引生成完成。在生产环境中,这通常是不能接受的。可以设置允许写入与索引创建并行发生,但有几个需要注意的注意事项 - 有关更多信息,请参阅并发构建索引。
创建索引后,系统必须保持索引与数据表的同步。这增加了数据操作操作的开销。因此,查询中很少或从未使用的索引应该被删除。
PostgreSQL提供了几种索引类型:B-tree,Hash,GiST,SP-GiST,GIN和BRIN。每个索引类型使用不同的算法,适合不同种类的查询。默认情况下,CREATE INDEX命令创建B-tree索引,这符合最常见的情况。
B-tree可以处理对可以排序成某些顺序的数据的等式和范围查询。特别地,当索引列参与使用以下运算符之一的比较时, PostgreSQL查询计划器将考虑使用B-tree索引:
< <= = >= >
也可以使用B-tree索引搜索来实现与这些运算符的组合相同的构造,如BETWEEN和IN。此外,索引列上的IS NULL或IS NOT NULL条件可以与B-tree索引一起使用。
对于涉及模式匹配运算符LIKE的查询,优化器还可以使用B-tree索引,如果模式是常量,并且锚定到字符串的开头,例如col LIKE 'foo%'或 col〜'^ foo',但不能是col LIKE'%bar'。但是,如果您的数据库不使用C语言环境,则需要使用特殊的运算符类创建索引,以支持对模式匹配查询的索引;见下文第11.9节。也可以对 ILIKE和〜*使用B-tree索引,但只有当模式以非字母字符(即不受大小写转换影响的字符)开始时才可以。
B-tree索引也可用于按排序顺序检索数据。这并不总是比简单的扫描和排序更快,但它通常是有益的。
Hash索引只能处理简单的等式比较。当使用=运算符进行比较时,查询计划器将考虑使用Hash索引。以下命令用于创建Hash索引:
CREATE INDEX name ON table USING HASH (column);
https://www.cnblogs.com/jiaoyiping/p/7191300.html