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

Grant Limberg
fuente
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

Justin Johnson
fuente
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

Sí, vea Restricciones de InnoDB y FOREIGN KEY .

Robert Gamble
fuente
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.

Thomas Lundström
fuente
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.

Fahmi
fuente
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.

Wolf5370
fuente
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
Navrattan Yadav
fuente
0

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

giapnh
fuente
-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);
Ali Raza
fuente