2010-04-05 30 views
8

Siempre he tratado de tener una clave primaria entera en una tabla pase lo que pase. Pero ahora estoy cuestionando si esto siempre es necesario.índices de texto frente a índices enteros en mysql

Digamos que tengo una tabla de productos y cada producto tiene un número SKU global único, que sería una cadena de, digamos, 8-16 caracteres. ¿Por qué no hacer esto el PK? Normalmente haría de este campo un índice único, pero luego tendría un campo int de incremento automático como PK, ya que supuse que sería más rápido, más fácil de mantener y me permitiría hacer cosas como obtener los últimos 5 registros añadidos con facilidad.

Pero en términos de optimización, asumiendo que solo coincidiría con el campo de texto completo y luego haciendo consultas de concordancia de texto (por ejemplo, como %%) pueden pensar en alguna razón para no usar una clave primaria basada en texto, lo más probable es que varchar()?

Saludos, imanc

+0

posible duplicado de http://stackoverflow.com/questions/63090/surrogate-vs-natural-business-keys – outis

Respuesta

6

Usar el número de SKU como clave principal tiene sentido. Le gustará indexarlo para realizar búsquedas por SKU rápidamente. Y SKU es un natural index.

sin embargo, tiene algunas sanciones:

  • Rendimiento (como dijo Coronatus)

  • La falta de flexibilidad de diseño. Si, por algún motivo, la SKU deja de ser globalmente única, se verá obligado a cambiar no solo la estructura de la tabla, sino también todas sus consultas.

  • Cambiar la SKU de un elemento lo forzará a cambiar todas las relaciones en la base de datos.

-2

computadoras son mucho más rápido en comparación de los números de cuerdas.

Además, los índices de cadenas de MySQL solo contienen las primeras 4 letras de forma predeterminada.

Si tiene cadenas blabfoo, blabbar, blabboo, el índice será totalmente inútil porque los primeros 4 caracteres son iguales, por lo que una búsqueda de "blabf" inicialmente combinará TODAS las 3 cadenas, luego iterará sobre los resultados.

Básicamente, nunca use cadenas para los índices porque son lentos y usan más espacio.

+5

Esto es simplemente incorrecta. Por defecto, MySQL indexará la cadena completa (a menos que sea un texto/blob, en cuyo caso debe especificar la longitud), y la recuperación de filas a través de una columna de cadena indexada es muy rápida. – grahamparks

+0

@grahamparks Gran comentario, pero ¿qué tan rápido se compara con los índices enteros? –

Cuestiones relacionadas