2010-12-16 10 views
5

Pregunta rápida.¿Bloqueo de filas en MySql InnoDb con restricciones de clave externa e índices aplicados?

Hablando con mi amigo, con 25 años de experiencia db que me estaba diciendo si utiliza restricciones de clave externa en una base de datos; cuando se escribe una tabla, por ejemplo, una tabla de mensajes, bloqueará la fila relativa en la tabla principal para, por ejemplo, los usuarios.

¿Es esto cierto?

Después le dijo que la aplicación de índices para las columnas de clave externa debe superar este bloqueo a cabo, es esto cierto?

Me preocupa que mi tráfico del sitio web está creciendo y puedo imaginar que esto sea un problema!

Gracias!

+0

no puedo decir nada por el bloqueo de los padres de la tabla, pero sé que la indexación de sus columnas de clave externa es una idea brillante. Especialmente dado que probablemente uses esas llaves para uniones. Hacer esto puede aumentar el rendimiento de su consulta en órdenes de magnitud. – Stephen

+0

El uso de combinaciones debe hacerse con cuidado (solo cuando sea necesario) en el servidor del clúster, puede terminar con escaneos de tabla completos que realmente duelen. – zanlok

Respuesta

9

escribí un post sobre esto - http://www.mysqlperformanceblog.com/2010/09/20/instrumentation-and-the-cost-of-foreign-keys/ - la demo es igual que su amigo describió. ¡Hay bloqueo en las filas principales!

Ahora viene la parte de explicar la diferencia entre un "índice" y una "clave":

  • Una de las claves es como una propiedad relacional de alto nivel. Esto coincide con eso.
  • Un índice es un detalle de implementación.

Desde el MySQL manual, "InnoDB requiere índices de claves ajenas y claves referenciadas, así las claves foráneas pueden ser rápido y no requiere un recorrido de tabla.". Es decir, si no agrega un índice cuando agrega su clave externa, InnoDB lo hará automáticamente.

Ninguna cantidad de indexación impide el bloqueo de los padres se describe en mi blog.

+0

Gracias por su respuesta detallada –

+0

@ Morgan-Tocker las cerraduras podrían mitigarse mediante la creación de tablas cuyo único propósito es proporcionar una lista actualizada de las claves principales que el niño tiene claves ajenas de? Por ejemplo: la tabla C tiene dos hijos (A y E). Mi idea es crear dos tablas de una sola columna (B y D) que contengan una clave externa a C (actualizada con activadores en C). Si una clave externa A/E para B/D en lugar de C impediría que una pueda bloquear a la otra pero mantenga el valor de las restricciones de clave externa? – danielcraigie

+0

El bloqueo se puede reducir con la normalización en general; ya que la granularidad más pequeña de los bloqueos está en el nivel de la fila. –

Cuestiones relacionadas