PostgreSQL provides several index types: B-tree, R-tree,
GiST, and Hash. Each index type is more appropriate for a particular query type because of
the algorithm it uses. By default, the CREATE INDEX command will create a B-tree index, which fits the most
common situations. In particular, the PostgreSQL query
optimizer will consider using a B-tree index whenever an indexed column is involved in a
comparison using one of these operators: <, <=,
=, >=, >
R-tree indexes are especially suited for
spatial data. To create an R-tree index, use a command of the form
CREATE INDEX name ON table USING RTREE (column);
The PostgreSQL query optimizer will consider using an
R-tree index whenever an indexed column is involved in a comparison using one of these
operators: <<, &<, &>, >>, @,
~=, && (Refer to Section 6.9
about the meaning of these operators.)
The query optimizer will consider using a
hash index whenever an indexed column is involved in a comparison using the = operator. The following command is used to create a hash index:
CREATE INDEX name ON table USING HASH (column);
Note: Testing has shown PostgreSQL's hash indexes to be similar or slower than
B-tree indexes, and the index size and build time for hash indexes is much worse. Hash
indexes also suffer poor performance under high concurrency. For these reasons, hash
index use is discouraged.
The B-tree index is an implementation of Lehman-Yao high-concurrency B-trees. The R-tree
index method implements standard R-trees using Guttman's quadratic split algorithm. The hash
index is an implementation of Litwin's linear hashing. We mention the algorithms used solely
to indicate that all of these access methods are fully dynamic and do not have to be
optimized periodically (as is the case with, for example, static hash access methods).