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).