índices de mysql 5.0: únicos vs no únicos

¿Cuál es la diferencia entre mysql índice único y no único en términos de rendimiento? Digamos que quiero hacer un índice en un combo de 2 columnas, y la combinación es única, pero creo un índice no único. ¿Eso tendrá algún efecto significativo en el rendimiento o la memoria que usa mysql? La misma pregunta es si hay una diferencia entre la clave principal y el índice único.

ÚNICA y PRIMARY KEY son restricciones , no índices. Aunque la mayoría de las bases de datos implementan estas restricciones mediante el uso de un índice. La sobrecarga adicional de la restricción además del índice es insignificante, especialmente cuando se cuenta el costo de rastrear y corregir duplicados involuntarios cuando ocurren (no si).

Los índices suelen ser más efectivos si tienes una alta selectividad . Esta es la relación entre el número de valores distintos y el número total de filas.

Por ejemplo, en una columna para Número de seguridad social, puede tener 1 millón de filas con 1 millón de valores distintos. Entonces la selectividad es 1000000/1000000 = 1.0 (aunque hay raras excepciones históricas, los SSN están destinados a ser únicos).

Pero otra columna en esa tabla, “género” solo puede tener dos valores distintos en más de 1 millón de filas. 2/1000000 = selectividad muy baja.

Se garantiza que un índice con una restricción UNIQUE o PRIMARY KEY tenga una selectividad de 1.0, por lo que siempre será tan eficaz como lo puede ser un índice.

Preguntaste sobre la diferencia entre una clave principal y una restricción única. Principalmente, se puede tener solo una restricción de clave principal por tabla (incluso si la definición de esa restricción incluye varias columnas), mientras que puede tener múltiples restricciones únicas. Una columna con una restricción única puede permitir valores NULL, mientras que las columnas en restricciones de clave principal no deben permitir valores NULL. De lo contrario, la clave principal y única son muy similares en su implementación y su uso.

Usted preguntó en un comentario sobre si usar MyISAM o InnoDB. En MySQL, usan el término motor de almacenamiento . Hay muchas diferencias sutiles entre estos dos motores de almacenamiento, pero los principales son:

  • InnoDB admite transacciones, por lo que puede optar por retrotraer o confirmar cambios. MyISAM es, de hecho, siempre autocommitido.
  • InnoDB impone restricciones de clave externa. MyISAM no aplica o incluso almacena restricciones de clave externa.

Si estas características son cosas que necesita en su aplicación, entonces debe usar InnoDB.


Para responder a tu comentario, no es tan simple. InnoDB es realmente más rápido que MyISAM en bastantes casos, por lo que depende de la combinación de selecciones, actualizaciones, consultas concurrentes, índices, configuración del búfer, etc. de la aplicación.

Consulte http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/ para obtener una comparación de rendimiento muy completa de los motores de almacenamiento. InnoDB gana más de MyISAM con la suficiente frecuencia que es claramente imposible decir que uno es más rápido que el otro.

Al igual que con la mayoría de las preguntas relacionadas con el rendimiento, la única forma de responderlo para su aplicación es probar ambas configuraciones usando su aplicación y una muestra representativa de datos, y medir los resultados.

¿En un índice no único que resulta ser único y un índice único? No estoy seguro, pero supongo que no mucho. El optimizador debería examinar la cardinalidad del índice y usar eso (siempre será el número de filas, para un índice único).

En lo que se refiere a la clave primaria, probablemente sea bastante, pero depende del motor que use.

El motor InnoDB (que es utilizado por muchas personas) siempre agrupa filas en la clave principal. Esto significa que el PK se combina esencialmente con los datos de fila reales. Si está haciendo muchas búsquedas por PK (o de hecho, escaneos de rango, etc.), esto es una buena cosa, porque significa que no tendrá que buscar tantos bloques del disco.

Un índice único que no sea PK nunca se agrupará en InnoDB.

Por otro lado, algunos otros motores (MyISAM en particular) no agrupan el PK, por lo que la clave primaria es como un índice único normal.