Iremos descrever simplificadamente o atual comportamento do PostgreSQL no que tange a indexes em chaves estrangeiras, chaves primárias e em uniques
Primary Key: PostgreSQL cria automaticamente índice ao se definir uma coluna como chave primária. Nâo é necessário criar um índice explicíto para colunas que são chaves primária.
Todas as vezes que o PostgreSQL efetuar a criação implícita de índice, será registrado no log um notice.
Unique: PostgreSQL cria automaticamente índice ao se definir uma coluna como unique
Foreign Key: Em chaves estrangeiras, o PostgreSQL não efetua a criação de índices automaticamente.
Em geral é uma boa ideia criar índices em chaves estrangeiras. Mas isto deve ser uma otimização que deve ser feita pelo operador a seu critério
Importante lembrar que adicionar índices acelera o custo de SELECTs. No entanto há perda de performance em todas as operações de INSERT, UPDATE e DELETE, visto que adicionam passos extras a simples operação. É um custo pequeno, mas ele é adicionado. Da mesma forma que o ganho do SELECT é grande quanto maior a tabela.