PostgreSQL proporciona varios tipos de índices:
B-tree, Hash, GiST, SP-GiST, GIN, BRIN y la extensión bloom.
Cada tipo de índice utiliza un
algoritmo diferente que se adapta mejor a diferentes tipos de cláusulas indexables.
Por defecto, el comando CREATE
INDEX crea
índices B-tree, que se adaptan a las situaciones más comunes.
Los otros tipos de índices se seleccionan escribiendo la palabra clave
USING seguida del nombre del tipo de índice.
Por ejemplo, para crear un índice Hash:
CREATE INDEXnombreONtablaUSING HASH (columna);
Los árboles B (B-trees) pueden manejar consultas de igualdad y de rango en datos que se pueden ordenar en algún orden jerárquico. En particular, el planificador de consultas de PostgreSQL considerará usar un índice B-tree siempre que una columna indexada esté involucrada en una comparación que utilice uno de estos operadores:
< <= = >= >
Las construcciones equivalentes a combinaciones de estos operadores, como
BETWEEN e IN, también se pueden implementar con
una búsqueda de índice B-tree. Además, una condición IS NULL o IS NOT
NULL en una columna de índice se puede usar con un índice B-tree.
El optimizador también puede usar un índice B-tree para consultas que involucren los
operadores de coincidencia de patrones LIKE y ~
si el patrón es una constante y está anclado al
principio de la cadena — por ejemplo, col LIKE
'foo%' o col ~ '^foo', pero no
col LIKE '%bar'. Sin embargo, si tu base de datos no
usa la localización C, necesitarás crear el índice con una clase de
operadores especial para admitir la indexación de consultas de coincidencia de patrones; consulta
Section 11.10 a continuación. También es posible usar
índices B-tree para ILIKE y
~*, pero solo si el patrón comienza con
caracteres no alfabéticos, es decir, caracteres que no se ven afectados por
la conversión a mayúsculas/minúsculas.
Los índices B-tree también se pueden usar para recuperar datos en orden ordenado. Esto no siempre es más rápido que un escaneo y ordenación simples, pero a menudo resulta útil.
Los índices Hash almacenan un código hash de 32 bits derivado del valor de la columna indexada. Por lo tanto, dichos índices solo pueden manejar comparaciones de igualdad simples. El planificador de consultas considerará usar un índice hash siempre que una columna indexada esté involucrada en una comparación que utilice el operador de igualdad:
=
Los índices GiST no son un tipo único de índice, sino más bien una infraestructura dentro de la cual se pueden implementar muchas estrategias de indexación diferentes. En consecuencia, los operadores particulares con los que se puede usar un índice GiST varían según la estrategia de indexación (la clase de operadores). Como ejemplo, la distribución estándar de PostgreSQL incluye clases de operadores GiST para varios tipos de datos geométricos bidimensionales, que admiten consultas indexadas utilizando estos operadores:
<< &< &> >> <<| &<| |&> |>> @> <@ ~= &&
(Consulta Section 9.11 para conocer el significado de
estos operadores).
Las clases de operadores GiST incluidas en la distribución estándar están
documentadas en Table 65.1.
Muchas otras clases de operadores GiST están disponibles en la colección contrib o como proyectos independientes. Para más información, consulta Section 65.2.
Los índices GiST también son capaces de optimizar búsquedas de “vecino más cercano” (nearest-neighbor), como:
SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
que encuentra los diez lugares más cercanos a un punto objetivo dado. La capacidad de hacer esto depende nuevamente de la clase de operadores particular que se esté utilizando. En Table 65.1, los operadores que se pueden usar de esta manera se enumeran en la columna “Ordering Operators”.
Los índices SP-GiST, al igual que los índices GiST, ofrecen una infraestructura que admite varios tipos de búsquedas. SP-GiST permite la implementación de una amplia gama de diferentes estructuras de datos basadas en disco no balanceadas, como árboles quadtree, árboles k-d y árboles de prefijos o radix trees (tries). Como ejemplo, la distribución estándar de PostgreSQL incluye clases de operadores SP-GiST para puntos bidimensionales, que admiten consultas indexadas utilizando estos operadores:
<< >> ~= <@ <<| |>>
(Consulta Section 9.11 para conocer el significado de estos operadores). Las clases de operadores SP-GiST incluidas en la distribución estándar están documentadas en Table 65.2. Para más información, consulta Section 65.3.
Al igual que GiST, SP-GiST admite búsquedas de “vecino más cercano”. Para las clases de operadores SP-GiST que admiten la ordenación por distancia, el operador correspondiente se enumera en la columna “Ordering Operators” en Table 65.2.
Los índices GIN son “índices invertidos” que son apropiados para valores de datos que contienen múltiples valores componentes, como arrays (arreglos). Un índice invertido contiene una entrada separada para cada valor componente, y puede manejar eficientemente consultas que comprueban la presencia de valores componentes específicos.
Al igual que GiST y SP-GiST, GIN puede admitir muchas estrategias de indexación diferentes definidas por el usuario, y los operadores particulares con los que se puede usar un índice GIN varían según la estrategia de indexación. Como ejemplo, la distribución estándar de PostgreSQL incluye una clase de operadores GIN para arrays, que admite consultas indexadas utilizando estos operadores:
<@ @> = &&
(Consulta Section 9.19 para conocer el significado de
estos operadores).
Las clases de operadores GIN incluidas en la distribución estándar están
documentadas en Table 65.3.
Muchas otras clases de operadores GIN
están disponibles en la colección contrib o como proyectos independientes. Para más información, consulta Section 65.4.
Los índices BRIN (una abreviatura de Block Range INdexes, o índices de rangos de bloques) almacenan resúmenes sobre los valores almacenados en rangos de bloques físicos consecutivos de una tabla. Por lo tanto, son más efectivos para columnas cuyos valores están muy correlacionados con el orden físico de las filas de la tabla. Al igual que GiST, SP-GiST y GIN, BRIN puede admitir muchas estrategias de indexación diferentes, y los operadores particulares con los que se puede usar un índice BRIN varían según la estrategia de indexación. Para los tipos de datos que tienen un orden de clasificación lineal, los datos indexados corresponden a los valores mínimos y máximos de los valores en la columna para cada rango de bloques. Esto admite consultas indexadas utilizando estos operadores:
< <= = >= >
Las clases de operadores BRIN incluidas en la distribución estándar están documentadas en Table 65.4. Para más información, consulta Section 65.5.