PostgreSQL crea automáticamente índices en claves primarias y restricciones únicas, pero no en el lado de referencia de las relaciones de clave externa.
Cuando Pg crea un índice implícito, emitirá un NOTICE
mensaje de nivel que puede ver en psql
y/o los registros del sistema, para que pueda ver cuándo sucede. Los índices creados automáticamente son visibles en \d
salida para una tabla, también.
La documentación sobre índices únicos dice:
PostgreSQL crea automáticamente un índice para cada restricción única y restricción de clave principal para imponer la unicidad. Por lo tanto, no es necesario crear un índice de forma explícita para las columnas de clave principal.
y la documentación sobre restricciones dice:
Dado que una ELIMINACIÓN de una fila de la tabla a la que se hace referencia o una ACTUALIZACIÓN de una columna a la que se hace referencia requerirá un escaneo de la tabla de referencia para las filas que coincidan con el valor anterior, a menudo es una buena idea indexar las columnas de referencia. Debido a que esto no siempre es necesario, y hay muchas opciones disponibles sobre cómo indexar, la declaración de una restricción de clave externa no crea automáticamente un índice en las columnas de referencia.
Por lo tanto, debe crear índices en claves foráneas usted mismo si los desea.
Tenga en cuenta que si usa claves foráneas primarias, como 2 FK como PK en una tabla de M a N, tendrá un índice en el PK y probablemente no necesite crear índices adicionales.
Si bien suele ser una buena idea crear un índice en (o incluir) las columnas de clave externa del lado de referencia, no es obligatorio. Cada índice que agrega ralentiza ligeramente las operaciones DML, por lo que paga un costo de rendimiento en cada INSERT
, UPDATE
o DELETE
. Si rara vez se usa el índice, es posible que no valga la pena tenerlo.