¿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.
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.
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.
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.
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.7documentos :
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.
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.
Aparentemente, un índice se crea automáticamente como se especifica en el enlace que Robert ha publicado .
Restricciones de InnoDB y FOREIGN KEY
fuente
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.
Sí, vea Restricciones de InnoDB y FOREIGN KEY .
fuente
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):
fuente
Para aquellos que buscan presupuesto de
5.7
documentos :fuente
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.
fuente
Sí,
Innodb
proporcione esto. Puede poner un nombre de clave foránea después de laFOREIGN KEY
cláusula o dejarlo para que MySQL cree un nombre para usted. MySQL crea automáticamente un índice con elforeign_key_name
nombre.fuente
Sí, Mysql indexa la clave externa automáticamente cuando crea una tabla que tiene una clave externa para otra.
fuente
No es posible obtener la clave de índice automáticamente
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ífuente