2008-11-20 13 views

Respuesta

157

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

+0

¿Tiene alguna razón para creer que MySQL volverá a permitir que las claves externas en columnas sin índices de cualquier otro tipo de mesa? –

+0

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 externas en columnas no indexadas. –

+0

Aparentemente esto no es verdad. Tengo una gran tabla (1 millón de registros) y cuenta (*) 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

90

Aparentemente, se crea automáticamente un índice como se especifica en the link robert has posted.

InnoDB requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. (This is in contrast to some older versions, in which indexes had to be created explicitly or the creation of foreign key constraints would fail.) index_name, if given, is used as described previously.

InnoDB and FOREIGN KEY Constraints

+6

+1 respuesta mucho mejor que la seleccionada como prueba de los documentos –

+4

El texto entre comillas ya no parece estar incluido en los documentos de MySQL, por lo que no está claro si esto sigue siendo cierto o no. – user2045006

+5

@ user2045006 puede consultar [doc 5.0] (http://dev.mysql.com/doc/refman/5.0/es/create-table-foreign-keys.html) así como [doc 5.6] (http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html) para el texto exacto citado – sactiw

4

Como se ha dicho que hace por InnoDB. Al principio, pensé que era extraño que muchos otros (en particular MS SQL y DB2) no lo hicieran. 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 deberí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. Por lo tanto, puede ser esa 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 puede causar problemas con el rendimiento y el espacio.

9

Usted no consigue el índice de forma automática si lo hace un ALTER TABLE (en lugar de CREATE TABLE), al menos según the docs (el enlace es de 5,1 pero es lo mismo para 5.5):

[...] When you add a foreign key constraint to a table using ALTER TABLE, remember to create the required indexes first.

+9

Probé en _5.5.31_ y 'ALTER TABLE' creó un índice. –

+2

También probé con MySQL 5.6 y MariaDB 10 y ALTER TABLE crearon un índice. Es interesante que mysqlindexcheck haya informado que el índice es un "índice redundante". Intenté dejarlo pero recibí el siguiente error: "ERROR 1553 (HY000): No se puede eliminar el índice 'index_name': necesario en una restricción de clave externa". Por lo tanto, no es posible descartar ese índice y conservar la clave externa. –

2

Sí, Innodb proporciona esto. Puede poner un nombre de clave externa después de FOREIGN KEY cláusula o dejar que MySQL cree un nombre para usted. MySQL crea automáticamente un índice con el nombre foreign_key_name.

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

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

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

Nombre de la tabla que ha creado, por ejemplo, fotografías y FOREIGN KEY por ejemplo photograph_id. El código debe ser como este

ALTER TABLE photographs ADD INDEX (photograph_id); 
3

Para aquellos que están buscando cita de 5.7docs:

MySQL requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. This index might be silently dropped later, if you create another index that can be used to enforce the foreign key constraint. index_name, if given, is used as described previously.

Cuestiones relacionadas