PostgreSQL提供了好几种索引类型:B-tree, Hash, GiST, SP-GiST和GIN 。
B-tree索引也可以用来按照排序顺序检索数据。这并不总是比一个简单的扫描和排序快, 但通常是有帮助的。
Hash 索引只能处理简单的等于比较。当一个索引了的列涉及到使用=
操作符进行比较的时候,查询规划器会考虑使用 Hash 索引。
GiST 索引不是单独一种索引类型,而是一种架构,可以在这种架构上实现很多不同的索引策略。 因此,可以使用 GiST 索引的操作符高度依赖于索引策略(操作符类)。 作为示例,PostgreSQL的标准发布中包含用于二维几何数据类型的 GiST 操作符类。
GiST索引也可最优化"nearest-neighbor"检索,例如
SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
找出距离给出目标点最近的十个地点。能这样做也是依赖于使用特定的操作符类。
SP-GiST索引类似于GiST索引,提供一个支持不同类型检索的架构。 SP-GiST允许实现许多各种不同的非平衡的基于磁盘的数据结构,例如四叉树,k-d树和基数树(字典树)。 作为示例,PostgreSQL的标准发布中包含用于二维点的SP-GiST操作符类。
GIN 索引是反转索引,它可以处理包含多个键的值(比如数组)。与 GiST和SP-GiST 类似, GIN 支持用户定义的索引策略,可以使用 GIN 索引的操作符根据索引策略的不同而不同。 作为示例,PostgreSQL的标准发布中包含用于一维数组的 GIN 操作符类。
一个单独的索引扫描只能用于这样的条件子句:使用被索引字段和索引操作符类中的操作符, 并且这些条件以AND连接。
PostgreSQL能够组合多个索引(包括同一索引的多次使用) 来处理单个索引扫描不能实现的情况。系统可以在多个索引扫描之间组成AND 和OR条件。比如,一个类似WHERE x = 42 OR x = 47 OR x = 53 OR x = 99 这样的查询可以分解成四个在x上的独立扫描,每个扫描使用一个条件, 最后将这些扫描的结果 OR 在一起,生成最终结果。另外一个例子是,如果我们在x 和y上有独立的索引,一个类似WHERE x = 5 AND y = 6 这样的查询可以分解为几个使用独立索引的子句,然后把这几个结果 AND 在一起,生成最终结果。
为了组合多个索引,系统扫描每个需要的索引,然后在内存里组织一个位图, 它给出索引扫描报告符合索引条件的表数据行的位置。然后,根据查询的需要, 把这个位图使用 AND 和 OR 合并在一起。最后,访问实际的表检索并返回数据行。 表的数据行是按照物理顺序进行访问的,因为那就是位图的布局; 这就意味着任何原来的索引排序都将消失,而如果查询有一个ORDER BY子句, 那么还会有一个额外的排序步骤。因为这个原因,以及每个额外的索引扫描都增加了额外的时间, 规划器有时候会选择使用简单的索引扫描,即使有多个索引可用也如此。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26477398/viewspace-2122683/
,如需转载,请注明出处,否则将追究法律责任。