¿MySQL indexa automáticamente las columnas de clave foránea?


¿MySQL indexa automáticamente las columnas de clave foránea?

Author: Micha Wiedenmann, 2008-11-20

8 answers

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

 172
Author: Grant Limberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-20 04:33:23

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

InnoDB requiere índices en claves foráneas y claves referenciadas para que las comprobaciones de claves foráneas puedan ser rápidas y no requieran un análisis de tabla. En la tabla de referencia, debe haber un índice donde las columnas de clave foránea se listen como las primeras columnas en el mismo orden. Dicho índice se crea automáticamente en la tabla de referencia si no existe. (Esto es, en a diferencia de algunas versiones anteriores, en las que los índices tenían que crearse explícitamente o la creación de restricciones de clave externa fallaría.) index_name, si se indica, se usa como se describió anteriormente.

Restricciones InnoDB y CLAVE FORÁNEA

 105
Author: Justin Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-20 19:56:31
 20
Author: Robert Gamble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-19 09:15:46

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

[...] Cuando agregue una restricción de clave foránea a una tabla usando ALTER TABLE, recuerde crear primero los índices requeridos.

 10
Author: Thomas Lundström,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-08 08:50:46

Como se indica lo hace para InnoDB. Al principio pensé que era extraño que muchos otros (en particular MS SQL y DB2) no. Los escaneos de espacios de tabla solo son mejores que los escaneos de índices cuando hay muy pocas filas de tablas, por lo que para la gran mayoría de los casos, una clave foránea querría ser indexada. Entonces me golpeó-esto no significa necesariamente que tenga que ser un índice independiente (una columna) - donde está en el índice FK automático de MySQL. Por lo tanto, puede ser que es la razón MS SQL, DB2 (Oracle no estoy seguro on), etc. déjelo en manos del DBA; después de todo, múltiples índices en tablas grandes pueden causar problemas con el rendimiento y el espacio.

 4
Author: Wolf5370,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-28 23:35:28

Para aquellos que buscan cita de 5.7 docs :

MySQL requiere índices en claves foráneas y claves referenciadas para que las comprobaciones de claves externas pueden ser rápidas y no requieren un análisis de la tabla. En el tabla de referencia, debe haber un índice donde la clave foránea las columnas se enumeran como las primeras columnas en el mismo orden. Tal el índice se crea automáticamente en la tabla de referencia si no lo hace existir. Este índice podría ser silenciosamente caído más tarde, si crear otro índice que se puede utilizar para aplicar la restricción de clave foránea. index_name, si se indica, se usa como se describió anteriormente.

 4
Author: Fahmi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-25 08:51:53

Sí, Innodb proporcione esto. Puede poner un nombre de clave foránea después de la cláusula FOREIGN KEY o dejarlo para 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
Author: Navrattan Yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-01 11:22:01

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 CLAVE FORÁNEA por ejemplo photograph_id. El código debe ser así

ALTER TABLE photographs ADD INDEX (photograph_id);
 -2
Author: Ali Raza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-24 06:49:40