Claves foráneas en un clúster MySQL

Por el 5 de febrero de 2008

en: Sin categoría

Para empezar debemos de tener claro ¿Qué es un clúster y que prestaciones ofrece? Un clúster es una unión de múltiples ordenadores que son visto externamen como un único ordenador muy potente y que puede o debe ser utiliado para los siguientes objetivos:

  1. Alto rendimiento (High Performance)
  2. Alta disponibilidad (High Availability)
  3. Equilibrio de carga (Load Balancing)
  4. Escalabilidad (Scalability)

Un clúster MySQL por lo tanto es una tecnología que nos permite optimizar el rendimiento de nuestras bases de datos con hardware no muy costoso y con unos requrimientos muy básicos de software. Un clúster MysSQL integra un servidor MySQL y un motor de almacenamiento en memoria llamado NDB clúster que permite funcionar en un conjunto de ordenadores.

Clúster MySQL

Según este esquema las tablas de la base de datos se almacenan utilizando el motor NDB y se puede acceder a los datos almacenados en el clúster a través de cualquiera de los nodos, estos nodos funcionan como espejos unos de otros lo que permite que la caída de un nodo de datos no afecte al conjunto de ordenadores.

Los principales procesos necesarios para hacer funcionar un clúster de MySQL son: MySQLD, NDBD, NDB_MGMD.

Building a High-Availability MySQL Cluster

Claves foránes en MySQL

A partir de la versión 4.0, MySQL agregó InnoDB a la lista de tipos de tablas soportadas por defecto, para aquellos que no saben demasiado sobre estas tecnologías de almacenamiento de datos decir que MyISAM es el utilizado por defecto en la mayoría de los casos pero no por ello el que más se adapte a las necesidades de nuestra aplicación.

MyISAM vs InnoDB

MySql soporta distintas tecnologías de almacenamiento de datos, entre estas destacan MyISAM e InnoDB, el primero de ellos (MyISAM) es el utilizado por defecto pero en la mayoría de los casos podremos cambiarlo cuando queramos.

Clúter MySQL

Ventajas: MyISAM vs InnoDB

InnoDB

  • Soporte de transacciones
  • Bloqueo de registros
  • Nos permite tener las características ACID (Atomicity, Consistency, Isolation and Durability: Atomicidad, Consistencia, Aislamiento y Durabilidad en español), garantizando la integridad de nuestras tablas.
  • Es probable que si nuestra aplicación hace un uso elevado de INSERT y UPDATE notemos un aumento de rendimiento con respecto a MyISAM.

MyISAM

  • Mayor velocidad en general a la hora de recuperar datos.
  • Recomendable para aplicaciones en las que dominan las sentencias SELECT ante los INSERT / UPDATE.
  • Ausencia de características de atomicidad ya que no tiene que hacer comprobaciones de la integridad referencial, ni bloquear las tablas para realizar las operaciones, esto nos lleva como los anteriores puntos a una mayor velocidad.

La elección es un tema delicado ya que hay que conseguir la mejor relación de calidad acorde con nuestra aplicación, obviamente si necesitamos transacciones, claves foráneas y bloqueos tendremos que escoger InnoDB por el contrario escogeremos MyISAM en aquellos casos en los que predominen las consultas SELECT a la base de datos (un gran número de páginas webs).

Para poder entender los fundamentos de la integridad referencial lo mejor a menudo es ver casos prácticos, básicamente lo que buscamos con la integridad referencial es establecer una relación entre dos tablas y establecer un campo común a ambas de tal modo que siempre que queramos añadir un registro a la base de datos (“hijo”) nos aseguramos que exista su “padre”.

Este tipo de relaciones como explicamos un poco más arriba en el pasado no existían en MySQL y todo debía ser controlado desde la aplicación lo que hacía que el uso de MySQL en proyectos grandes estuviera un poco limitado.

Forzando claves foránes en MySQL

Ya hemos visto muy por encima los fundamentos de las claves foráneas y de un clúster de MySQL y ahora llega el turno del motivo de esta entrada, las claves foráneas no son soportadas por el motor de almacenamiento NDB y por lo tanto son ignoradas del mismo modo que si lo hicieramos sobre un tipo de almacenamiento MyISAM.

Estas son las principales limitaciones del uso de un Clúster MySQL.

Pero como casi todo en esta vida tenemos soluciones a esta importante limitación, necesitaríamos forzar las claves foráneas en MySQL.

Básicamente solucionamos el problema con “triggers” (evento que se ejecuta cuando se cumple una condición establecida al realizar una operación de inserción (INSERT), actualización (UPDATE) o borrado (DELETE).)

Triggers para la actualización y el borrado en cascada

CREATE TRIGGER update_ndb_child
  AFTER UPDATE
  ON ndb_child
  FOR EACH ROW
  BEGIN
    IF (SELECT COUNT(*) FROM ndb_parent WHERE nparent_id=new.nparent_id)=0
    THEN
      INSERT error_msg VALUES ('Foreign Key Constraint Violated!');
    END IF;
  END;
CREATE TRIGGER delete_ndb_child
  BEFORE DELETE
  ON ndb_parent
  FOR EACH ROW
  BEGIN
    DELETE FROM ndb_child WHERE nparent_id=old.nparent_id;
  END;

CREATE TRIGGER delete_myisam_child
  BEFORE DELETE
  ON myisam_parent
  FOR EACH ROW
  BEGIN
    DELETE FROM myisam_child WHERE mparent_id=old.mparent_id;
  END;

Enforcing Foreign Keys Programmatically in MySQL

  • Entradas relacionadas:
  • No hay coincidencias

Dejar un comentario