Indexes are a common way to enhance database performance.  An index
  allows the database server to find and retrieve specific rows much
  faster than it could do without an index.  But indexes also add
  overhead to the database system as a whole, so they should be used
  sensibly.
 
   The classical example for the need of an index is if there is a
   table similar to this:
CREATE TABLE test1 (
    id integer,
    content varchar
);
   and the application requires a lot of queries of the form
SELECT content FROM test1 WHERE id = constant;
   Ordinarily, the system would have to scan the entire
   test1 table row by row to find all
   matching entries.  If there are a lot of rows in
   test1 and only a few rows (possibly zero
   or one) returned by the query, then this is clearly an inefficient
   method.  If the system were instructed to maintain an index on the
   id column, then it could use a more
   efficient method for locating matching rows.  For instance, it
   might only have to walk a few levels deep into a search tree.
  
   A similar approach is used in most books of non-fiction:  Terms and
   concepts that are frequently looked up by readers are collected in
   an alphabetic index at the end of the book.  The interested reader
   can scan the index relatively quickly and flip to the appropriate
   page, and would not have to read the entire book to find the
   interesting location.  As it is the task of the author to
   anticipate the items that the readers are most likely to look up,
   it is the task of the database programmer to foresee which indexes
   would be of advantage.
  
   The following command would be used to create the index on the
   id column, as discussed:
CREATE INDEX test1_id_index ON test1 (id);
   The name test1_id_index can be chosen
   freely, but you should pick something that enables you to remember
   later what the index was for.
  
   To remove an index, use the DROP INDEX command.
   Indexes can be added to and removed from tables at any time.
  
   Once the index is created, no further intervention is required: the
   system will use the index when it thinks it would be more efficient
   than a sequential table scan.  But you may have to run the
   ANALYZE command regularly to update
   statistics to allow the query planner to make educated decisions.
   Also read Chapter 10 for information about
   how to find out whether an index is used and when and why the
   planner may choose to not use an index.
  
   Indexes can benefit UPDATEs and
   DELETEs with search conditions.  Indexes can also be
   used in join queries.  Thus,
   an index defined on a column that is part of a join condition can
   significantly speed up queries with joins.
  
   When an index is created, the system has to keep it synchronized with the
   table.  This adds overhead to data manipulation operations.
   Therefore indexes that are non-essential or do not get used at all
   should be removed.  Note that a
   query or data manipulation command can use at most one index
   per table.