¿MySQL indexa columnas de clave externa automáticamente?


Respuestas:


229

Sí, pero solo en . Innodb es actualmente el único formato de tabla enviado que tiene claves externas implementadas.


1
¿Tiene alguna razón para creer que MySQL permitirá claves externas en columnas no indexadas para cualquier otro tipo de tabla?
Robert Gamble

Realmente no pude responder eso. Es posible que desee buscar los motores de almacenamiento Maria y Falcon que se lanzarán en MySQL 6.0 y ver si admiten claves foráneas en columnas no indexadas.
Grant Limberg el

Aparentemente esto no es cierto. Tengo una tabla grande (1 millón de registros) y cuento (*) donde fkey =? tomaría 15 segundos Se agregó un índice en la columna fkey, y las cosas van por debajo de un segundo ahora.
AbiusX

Mismo experimento con otra tabla y 10 millones de registros. Esto es ofc MySQL 5.1 InnoDB. La tabla tiene tres campos, uno es la clave principal entera, el otro ya está indexado. La tercera era una clave foránea para la clave primaria de otra tabla. Sin agregar un índice explícito, las búsquedas tardaron varios segundos aquí. Mostrar índice de la tabla tampoco mostró un índice en él.
AbiusX

@AbiusX 5.1 es probablemente demasiado viejo, vea la respuesta de MrAlexander a continuación.
e2-e4

131

Aparentemente, un índice se crea automáticamente como se especifica en el enlace que Robert ha publicado .

InnoDB requiere índices en claves externas y claves referenciadas para que las comprobaciones de claves externas puedan ser rápidas y no requieran un escaneo de tabla. En la tabla de referencia, debe haber un índice donde las columnas de clave externa se enumeran como las primeras columnas en el mismo orden. Dicho índice se crea en la tabla de referencia automáticamente si no existe. (Esto contrasta con algunas versiones anteriores, en las que los índices debían crearse explícitamente o la creación de restricciones de clave externa fallaba). Index_name, si se proporciona, se usa como se describió anteriormente.

Restricciones de InnoDB y FOREIGN KEY


9
+1 respuesta mucho mejor que la seleccionada como prueba de documentos
Gaz_Edge

66
El texto citado ya no parece estar incluido en los documentos de MySQL, por lo que no está claro si esto sigue siendo cierto o no.
Courtney Miles

77
@ user2045006, puede consultar el documento 5.0 y el documento 5.6 para ver el texto exacto citado
sábado

1
En los documentos actuales, solo hay un ligero cambio en el texto (supongo que el significado es similar):InnoDB permits a foreign key to reference any index column or group of columns. However, in the referenced table, there must be an index where the referenced columns are the first columns in the same order.
Lucas Basquerotto

20

44
Esta respuesta es un gran ejemplo de por qué una respuesta nunca debe consistir solo en un enlace a una posible respuesta. En este momento, la página vinculada no responde a la pregunta en absoluto.
Mike

1
Agregue toda la información a la respuesta en lugar de publicar solo un enlace
Nico Haase

11

No obtienes el índice automáticamente si haces una ALTER TABLE (en lugar de CREATE TABLE), al menos según los documentos (el enlace es para 5.1 pero es lo mismo para 5.5):

[...] Cuando agrega una restricción de clave externa a una tabla usando ALTER TABLE, recuerde crear primero los índices requeridos.


2
También probé en MySQL 5.6 y MariaDB 10 y ALTER TABLE creó un índice. Es interesante que mysqlindexcheck informó que ese índice es un "índice redundante". Traté de soltarlo pero recibí el siguiente error: "ERROR 1553 (HY000): No se puede soltar el índice 'index_name': necesario en una restricción de clave externa". Por lo tanto, no es posible eliminar ese índice y mantener la clave externa.
Ciprian Stoica

Es posible que desee revisar su respuesta. MySQL siempre crea un índice para acelerar las comprobaciones de claves externas si aún no existe una . Los documentos intentan decirle que crear índices antes de las restricciones de clave externa puede acelerar un poco las cosas. Por ejemplo, InnoDB podría utilizar un índice de clave compuesta que podría servir como índice para las comprobaciones de clave externa en lugar de generar automáticamente un índice redundante.
BMiner

7

Para aquellos que buscan presupuesto de 5.7 documentos :

MySQL requiere índices en claves externas y claves referenciadas para que las comprobaciones de claves externas puedan ser rápidas y no requieran un escaneo de tabla. En la tabla de referencia, debe haber un índice donde las columnas de clave externa se enumeran como las primeras columnas en el mismo orden. Dicho índice se crea en la tabla de referencia automáticamente si no existe. Este índice puede descartarse en silencio más adelante, si crea otro índice que pueda usarse para imponer la restricción de clave externa. index_name, si se proporciona, se usa como se describió anteriormente.


4

Como se dijo, lo hace para InnoDB. Al principio pensé que era extraño que muchos otros (en particular MS SQL y DB2) no lo hagan. Los escaneos de TableSpace son mejores que los escaneos de índice cuando hay muy pocas filas de tablas, por lo que para la gran mayoría de los casos, una clave externa querría ser indexada. Entonces me golpeó, esto no necesariamente significa que tiene que ser un índice independiente (una columna), donde está en el índice FK automático de MySQL. Entonces, puede ser que esa sea la razón por la cual MS SQL, DB2 (Oracle no estoy seguro), etc., lo dejan en manos del DBA; después de todos los índices múltiples en tablas grandes pueden causar problemas con el rendimiento y el espacio.


Trae un buen punto sobre los índices de clave compuesta; sin embargo, MySQL eliminará automática / silenciosamente un índice de clave única generado automáticamente si un índice de clave compuesta recién creado cumple la obligación de hacer que las comprobaciones de clave externa sean rápidas. Para ser honesto, no tengo idea de por qué MS SQL, DB2 y otros no hacen esto. Tienen poca excusa. No puedo pensar en un caso de uso en el que un índice generado automáticamente en claves externas sea perjudicial.
BMiner

2

Sí, Innodbproporcione esto. Puede poner un nombre de clave foránea después de la FOREIGN KEYcláusula o dejarlo para que MySQL cree un nombre para usted. MySQL crea automáticamente un índice con el foreign_key_namenombre.

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

0

Sí, Mysql indexa la clave externa automáticamente cuando crea una tabla que tiene una clave externa para otra.


-2

No es posible obtener la clave de índice automáticamente

ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)

Nombre de la tabla que ha creado, por ejemplo, fotografías y LLAVE EXTRANJERA, por ejemplo photograph_id. El código debería ser así

ALTER TABLE photographs ADD INDEX (photograph_id);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.