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