Hace MySQL índice de las columnas de clave externa de forma automática?

InformationsquelleAutor Dónal | 2008-11-20

8 Comentarios

  1. 197

    Sí, pero sólo en . Innodb es actualmente el único enviado formato de tabla que tiene las claves externas aplicadas.

    • ¿Tiene usted alguna razón para creer que MySQL jamás va a permitir que extranjeros claves en la no-columnas indizadas para cualquier otro tipo de tabla?
    • Yo realmente no podía responder a eso. Puede que desee buscar la Maria y Falcon motores de almacenamiento que van a ser liberados en MySQL 6.0 y ver si son compatibles con claves externas de las no-columnas indizadas.
    • Al parecer, esto no es cierto. Tengo una mesa grande (1 millón de registros) y count(*) donde fkey=? tomaría 15 segundos. Añadido un índice en el fkey columna, y las cosas pasan por debajo de un segundo ahora.
    • Mismo experimento con otra tabla y 10 millones de registros. Esta es la ofc MySQL 5.1 InnoDB. La tabla tiene tres campos, uno es la clave primaria entero, el otro ya está indexado. La tercera fue una clave externa a la clave primaria de otra tabla. Sin la adición de un índice explícita, las búsquedas tomó varios segundos aquí. Mostrar índice de la tabla no muestran un índice en ella.
    • 5.1 es, probablemente, demasiado viejo, ver MrAlexander la respuesta a continuación.
  2. 117

    Al parecer, se crea un índice automáticamente como se especifica en el enlace robert ha publicado.

    InnoDB requiere índices claves foráneas y se hace referencia a las teclas de modo que la comprobación de claves foráneas puede ser rápido y no requiere un examen de la tabla. En la tabla de referencia, debe haber un índice en el que las columnas de clave externa aparecen como las primeras columnas en el mismo orden. Ejemplo se crea un índice en la tabla de referencia automáticamente si no existe. (Esto está en contraste con algunas versiones anteriores, en los que los índices tuvo que ser creado de forma explícita o la creación de restricciones de clave externa sería un fracaso.) index_name, si se da, se utiliza como se describe anteriormente.

    InnoDB y Restricciones de CLAVE externa

    • +1 mucho mejor respuesta que la seleccionada como proporciona la prueba de docs
    • El texto citado no parecen estar incluidos en el MySQL docs ya, por lo que es claro si esto es cierto o no.
    • usted puede referirse a la doc 5.0 así doc 5.6 para conocer el texto citado
  3. 11

    No obtener el índice de forma automática si hacer un ALTER TABLE (en lugar de CREAR la TABLA), al menos de acuerdo a el docs (el enlace es de 5.1 pero es el mismo para 5.5):

    […] Cuando se agrega una restricción de clave foránea de una tabla con ALTER TABLE, recuerde que debe crear la necesaria índices en primer lugar.

    • He intentado en 5.5.31 y ALTER TABLE creado un índice.
    • También probé en MySQL 5.6 y MariaDB 10 y ALTER TABLE en la jaula de un índice. Es interesante que mysqlindexcheck informó que el índice como «redundante índice». He intentado dejarlo pero tengo el siguiente error: «ERROR DE 1553 (HY000): No se puede drop index ‘index_name’: se necesita de una restricción foreign key». Por tanto, no es posible dejar caer el índice y mantener la clave externa.
    • Puede que desee revisar su respuesta. MySQL siempre crea un índice para acelerar la clave externa comprueba si no existe ya uno. Los médicos están tratando de decirle a usted que la creación de los índices antes de las restricciones de clave externa puede acelerar las cosas un poco. Por ejemplo, una clave compuesta índice que podría servir como un índice de la clave externa cheques podría ser utilizado por InnoDB en lugar de auto-generación de una redundante índice.
  4. 4

    Como se ha dicho, ¿para InnoDB. Al principio pensé que era extraño que muchos otros (en particular, MS SQL y DB2) no. Espacio de análisis son sólo mejor que el análisis de índice cuando hay muy pocas filas de la tabla – por lo que para la gran mayoría de los casos una clave externa queremos ser indexado. Entonces me di cuenta – esto no significa necesariamente tiene que ser independiente (una columna) en el índice donde se encuentra en MySQL automático FK Índice. Así, puede ser que es la razón de MS SQL, DB2 (Oracle no estoy seguro de en) etc a dejar a los administradores de bases de datos; después de todo varios índices en tablas de gran tamaño pueden causar problemas con el rendimiento y el espacio.

    • Un buen punto acerca de la clave compuesta índices; sin embargo, MySQL automáticamente/silencio caída de un auto-generado único índice de clave si se creará un nuevo compuesto de clave de índice cumple con la obligación de poner la clave externa cheques rápido. Para ser honesto, no tengo idea de por qué MS SQL, DB2, y otros no lo hacen. Tienen poco de excusa. No puedo pensar en un caso de uso cuando un auto-generado índice de claves foráneas sería perjudicial.
  5. 4

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

    MySQL requiere índices claves foráneas y se hace referencia a las claves para que
    la comprobación de claves foráneas puede ser rápido y no requiere un examen de la tabla. En el
    tabla de referencia, debe haber un índice en el que la clave externa
    las columnas aparecen como las primeras columnas en el mismo orden. Tal
    el índice se crea en la tabla de referencia automáticamente si no
    existen. Este índice podría ser en silencio cayó más tarde, si usted cree
    otro índice que puede ser utilizado para hacer cumplir la restricción de clave externa.
    index_name, si se da, se utiliza como se describe anteriormente.

  6. 2

    Sí, Innodb proporcionar esto. Usted puede poner un nombre de clave externo después de FOREIGN KEY cláusula o dejarlo para dejar de MySQL para crear un nombre para usted. MySQL crea automáticamente un índice con el foreign_key_name nombre.

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

    No es posible conseguir la clave de índice automáticamente el uso de

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

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

    ALTER TABLE photographs ADD INDEX (photograph_id);

Dejar respuesta

Please enter your comment!
Please enter your name here