2008-12-23 21 views
56

¿Cuál es la diferencia entre el índice único de mysql y el índice 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.índices de mysql 5.0 - Único vs no único

Respuesta

122

Ú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 son generalmente más efectivos si hay una alta selectividad de . 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 de más de 1 millón de filas. 2/1000000 = selectividad muy baja.

Un índice con una restricción ÚNICA o PRIMARY KEY tiene una selectividad de 1.0, por lo que siempre será tan eficaz como lo puede ser un índice.

Preguntas 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.

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

  • InnoDB admite transacciones, por lo que puede optar por retrotraer o confirmar los 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 su 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 de 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 del almacenamiento motores. 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.

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

+1

"Siempre será ..." siempre que su consulta proporcione un valor para cada campo en el índice; y ninguno de los valores proporcionados es nulo; y ninguno de los campos en la clave es NULLable (sorta). – dkretz

+0

Entonces, eso significa que si no necesito transacciones/restricciones de clave externa, es mejor usar MyISAM, y podemos esperar un mejor rendimiento de la misma. – Sanjay

+0

Jaja Siempre sé cuándo va a ser una respuesta de Bill Karwin incluso antes de desplazarme hacia abajo más allá del primer párrafo :) Siempre claro y perspicaz, gracias +1 –

2

¿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 una clave primaria, probablemente bastante, pero depende de qué motor 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án en InnoDB.

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

+0

Eso me lleva a la segunda pregunta, qué índice usar - Personalmente prefiero MyISAM como escuché, es mejor seleccionar el rendimiento de la consulta y es mucho más rápido cuando restauro un mysqldump. ¿Alguna razón por la que debería estar usando InnoDB? – Sanjay