11.2. Tipos de índices #

11.2.1. B-Tree
11.2.2. Hash
11.2.3. GiST
11.2.4. SP-GiST
11.2.5. GIN
11.2.6. BRIN

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 INDEX nombre ON tabla USING HASH (columna);

11.2.1. B-Tree #

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.

11.2.2. Hash #

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:

=

11.2.3. GiST #

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.

11.2.4. SP-GiST #

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.

11.2.5. GIN #

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.

11.2.6. BRIN #

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.