12

Una pregunta: ¿clave natural vs clave sustituta un innodb clave externa

tengo 2 tablas:

Product 
id INT 
name VARCHAR(64) 
something TEXT 
else INT 
entirely BOOL 

y

Ingredient 
id INT 
name VARCHAR(64) 
description TEXT 

Ahora también tengo una tabla de enlace

Products_Ingredients 
product_id INT 
ingredient_id INT 

para mi relación de muchos a muchos .

Ahora, tanto los productos como los ingredientes tendrán nombres únicos. Entonces puedo usar nombres como claves naturales ... ¿será una buena idea?

Decir que tengo un producto: Paint Thinner Supreme con el ingrediente: Butylonitrotetrocycline

¿Eso será una buena idea usar esos nombres como clave compuesta en la tabla de enlaces?

Por mucho que entiendo la idea detrás de usar claves naturales sobre los sustitutos, no puedo dejar de pensar que usar enteros simples como claves primarias (y extranjeras) será mucho más rápido. ¿Habrá alguna diferencia en la forma en que el servidor MySQL digiere esas diferentes claves?

¿Cuál es su opinión?

Respuesta

16

las opiniones no importa cuando se pueden medir.

Implementé esto en PostgreSQL usando claves naturales y sustitutos. Utilicé 300,000 productos en total, 180 ingredientes y dos tablas de "ingredientes de productos" con 3 a 17 ingredientes por producto, para 100,000 productos seleccionados al azar (1053462 filas).

Seleccionando todos los ingredientes para un solo producto usando las teclas naturales devueltas en 0.067 ms. Usando sustitutos, 0.199ms.

Devolviendo todas las columnas que no son de id para un único producto con las teclas naturales devueltas en 0,145 ms. Utilizando sustitutos, 0.222 ms

Por lo tanto, las claves naturales eran aproximadamente de 2 a 3 veces más rápidas en este conjunto de datos.

Las llaves naturales no requieren ninguna unión para devolver esta información. Las claves sustitutas requieren dos uniones.

La diferencia de rendimiento real depende del ancho de las tablas, el número de filas, el tamaño de página y la longitud de los nombres, y cosas por el estilo. Habrá un punto en el que las claves sustitutas comenzarán a superar las claves naturales, pero pocas personas intentan medir eso.

Cuando estaba diseñando la base de datos para la base de datos operacional de mi empleador, construí un banco de pruebas con tablas diseñadas alrededor de claves naturales y con tablas diseñadas con números de identificación. Ambos esquemas tienen más de 13 millones de filas de datos de muestra generados por computadora. En algunos casos, las consultas en el esquema de número de identificación superaron el esquema de clave natural en un 50%. (Por lo tanto, una consulta compleja que duró 20 segundos con números de identificación tardó 30 segundos con claves naturales). Pero el 80% de las consultas de prueba tenían un rendimiento de SELECCIÓN más rápido en comparación con el esquema de clave natural. Y a veces era asombrosamente más rápido: una diferencia de 30 a 1.

Esperamos que las claves naturales superen a los sustitutos en nuestra base de datos en los próximos años. (A menos que muevamos ciertas tablas a un SSD, en cuyo caso las claves naturales probablemente superen a los sustitutos para siempre.)

+0

Buena explicación, gracias. – RandomWhiteTrash

3

Para este caso me préféré claves suplentes porque

  1. el nombre de un producto o ingrediente pueden cambiar, especialmente si su contenido es generado por el usuario (por ejemplo, errores tipográficos o hay varios nombres posibles para un artículo)
  2. las llaves naturales serán mucho más tiempo que y por lo tanto ser menos eficiente
+0

+1 para llamar mi atención sobre el hecho de que los nombres pueden cambiar/pueden producirse errores tipográficos. Buen punto. – RandomWhiteTrash

+2

Ah, pero para eso están las actualizaciones en cascada: el cambio de nombre de claves naturales foráneas de forma automática. – RsrchBoy

+0

Buen punto RarchBoy, con suerte la clave no está relacionada con demasiados datos. – fabspro

Cuestiones relacionadas