2009-08-18 8 views
17

tengo curiosidad en cuanto a si¿Son mejores los índices únicos para el rendimiento de búsqueda de columnas? (PGSQL y MySQL)

CREATE INDEX idx ON tbl (columns); 

vs

CREATE UNIQUE INDEX idx ON tbl (columns); 

tiene una ventaja de rendimiento algorítmico significativo en PostgreSQL o MySQL implementaciones al escanear la columna (s) indizada o si la palabra clave UNIQUE simplemente introduce una restricción única junto con el índice.

Me imagino que es probablemente justo decir que hay un beneficio marginal en la medida en índices son susceptibles de ser implementado internamente como una especie de picadillo -como estructura, y la manipulación de colisión por resultado la definición en algo distinto de O (1) rendimiento. Dada esta premisa, es probable que si un gran porcentaje de valores es idéntico a la estructura degenere en algo lineal.

Por lo tanto, a los fines de mi pregunta, supongamos que la distribución de valores es relativamente discreta y uniforme.

¡Gracias de antemano!

1 Lo cual es una cuestión de pura especulación para mí, ya que no estoy familiarizado con las partes internas de RDBM.

Respuesta

15

Si sus datos son únicos, debe crear un índice UNIQUE en ellos.

Esto no implica una sobrecarga adicional y afecta las decisiones del optimizador en ciertos casos para que pueda elegir un mejor algoritmo.

En SQL Server y en PostgreSQL, por ejemplo, si clasifica por una clave UNIQUE, el optimizador ignora el ORDER BY cláusulas utilizadas después de eso (ya que son irrelevantes), i. mi. esta consulta:

SELECT * 
FROM mytable 
ORDER BY 
     col_unique, other_col 
LIMIT 10 

utilizará un índice en col_unique y no una especie de other_col porque es inútil.

Esta consulta:

SELECT * 
FROM mytable 
WHERE mycol IN 
     (
     SELECT othercol 
     FROM othertable 
     ) 

también se convertirá en una INNER JOIN (en oposición a una SEMI JOIN) si hay un índice UNIQUE en othertable.othercol.

Un índice contiene siempre una cierta clase de un puntero a la fila (ctid en PostgreSQL, puntero de fila en MyISAM, clave primaria/uniquifier en InnoDB) y las hojas están clasificadas en estos indicadores, por lo que, de hecho, cada hoja índice es único es de alguna manera (aunque puede no ser obvio).

Lee este artículo en mi blog para los detalles de rendimiento:

2

Bueno, por lo general los índices son los árboles B, no hashes (hay índices en base de patata, pero el índice más común (al menos en PostgreSQL) es bases en B Tree).

En cuanto a la velocidad: único debe ser más rápido: cuando el análisis de índice encuentra una fila con un valor determinado, no tiene que buscar si hay otras filas con este valor y puede finalizar la exploración de forma inmediata.

3

Hay una pequeña penalización durante las operaciones de actualización/inserción por tener la restricción única. Tiene que buscar antes de la operación de inserción/actualización para asegurarse de que la restricción de exclusividad no se viole.

Cuestiones relacionadas