Cuando de bases de datos relacionales se habla, es indiscutible que uno de los RDBMS (Relational Database Management System) líderes es MySQL. Fue tan importante en la historia de la tecnología que hasta el día de hoy permanece como un estándar. Alojó los datos de Facebook en sus inicios, y a día de hoy sirve de modelo para aplicaciones web mundialmente famosas, como Joomla, Wordpress o Drupal.
Sin embargo, esconde dentro de sí una variedad enorme para construir el corazón de cualquier aplicación: el esquema. Acompañame a ver como podemos diseñar con una exactitud quirúrgica la implementación de nuestras entidades y relaciones, utilizando los dos potentes motores que ofrece MySQL en su core: <ins>InnoDB</ins> y <ins>MyISAM</ins>
Antes de comenzar cualquier tutorial sobre bases de datos vale la pena recordar algunos conceptos básicos del diseño de las mismas, el cual es tan importante que dependiendo de su calidad puede dejar a una empresa en la bancarrota o convertirla en una startup.
Supongamos que vamos a construir un blog sobre autos deportivos 🚗🏁. Vamos a tener usuarios que publican posts, cada uno perteneciente a una categoría y con una o muchas etiquetas. Además, pueden escribir comentarios en cada artículo. Cada cosa remarcada en negrita es lo que llamamos entidad, la cual posee atributos que la caracterizan y relaciones con algunas otras.
En MySQL nosotros llamamos a las entidades tablas y a las bases de datos que alojan a estas entidades esquemas. Las tablas a veces reciben muchos registros en un tiempo corto, pero también muchas consultas en segundos. Por ejemplo, todas las semanas se registran nuevos usuarios, pero cada día se leen más de 10000 veces los posts del sitio. Y aquí está el quid de la cuestión…
Resulta que dentro de un Sistema Gestor de Bases de Datos existen también motores internos que se encargan de manejar, almacenar y recuperar información de las tablas que ya mencionamos. Se denominan storage-engine o motores de almacenamiento.
Lo importante es lograr encontrar el funcionamiento predominante de una tabla en nuestro sistema. ¿Vamos a escribir datos muy seguido? ¿Necesitamos hacer consultas constantemente? ¿Es importante cumplir con ACID (Atomicidad, Consistencia, Aislamiento y Durabilidad)?
Todas estas preguntas deben ser respondidas antes de crear la estructura de cada entidad. Una vez que lo hayamos hecho, es hora de escoger el engine correcto para construir nuestras tablas:
Es un motor diseñado exclusivamente para fortalecer la Atomicidad, Consistencia, Aislamiento y Durabilidad en una base de datos. ¿Queremos hacer una gran cantidad de Transacciones? InnoDB. ¿Queremos una integridad formidable en nuestros datos? InnoDB. Y lo más importante, ¿Vamos a hacer un fuerte uso de las sentencias INSERT
y UPDATE
? Definitivamente InnoDB.
Un caso ideal para este storage-engine sería nuestra tabla de usuarios, cuya sentencia SQL de creación podría ser algo parecido a esto:
CREATETABLEIFNOTEXISTS`users` (
idINTUNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(100) NOTNULL,
passwordVARCHAR(64) NOTNULL,
email VARCHAR(150) NOTNULLUNIQUE,
active TINYINT NOTNULLDEFAULT1,
) ENGINE=InnoDB;
Si estamos hablando de velocidad para hacer consultas, el claro ganador es MyISAM. Siendo optimistas (y buenos copywriters) nuestro blog recibirá miles y miles de vistas todos los días por fanáticos del automovilismo de todo el mundo. Sería un desastre que todo nuestro esquema de datos tardara más de lo esperado en responder a nuestro backend. Muchos usuarios se irían, y no queremos eso. Por ende, como van a producirse múltiples sentencias SELECT
, MyISAM debe formar parte del core de nuestra tabla.
Una vez más, un nominado excelente para un ejemplo es la tabla de posts:
CREATETABLEIFNOTEXISTS`posts` (
idINTUNSIGNED PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(150) NOTNULL,
contentTEXTNOTNULL,
author_id INTNOTNULL,
category_id INTNOTNULL,
Al ser el motor por defecto, no debemos aclararlo en la sentencia.
A partir de ahora sería un verdadero pecado como arquitectos de software o administradores de bases de datos no pensar en esta característica, que como dije en un principio puede a futuro determinar el éxito o fracaso de un proyecto. ¿Tienes alguna idea en mente que involucre datos que quieras hacer realidad? ¿Ya decidiste el storage-engine ideal para cada tabla? Házmelo saber en los comentarios, y no te pierdas el curso de SQL y MySQL de Platzi para profundizar en el tema y convertirte en un verdadero experto 😉
¡Muchas gracias por tu aporte! Lo acabo de leer y ahora me queda mucho más claro el concepto
De nada eduardo! 😉
Concuerdo con Eduardo, a pesar de haber llevado 3 semestres bases de Datos jamás me habían dicho esto y creo que como Ing en software es súper importante. Ya que si seré líder de proyectos debo saber que opciones pueden existir.
Hola lorerli cervances, yo tengo algo de tiempo laborando y no sabía sobre estos conceptos, así que siempre se aprende algo nuevo.
Muy buen articulo, para tener en cuenta.
La tabla MyISAM esta en memoria?
Que otro tipo de tablas son importantes para crear en un base de datos enfocada al rendimiento y a la integridad de los datos?
MyISAM es el motor por defecto, InnoDB si se tiene que declarar. Pequeño gran detalle.
gracias por el articulo
Bien por el articulo, desconocía que habían dos tipos de motores.
Gracias, después de leer este artículo es más clara la diferencia.
Muy claro todo, una herramienta más al tool de ingeniero de datos 😄
Excelente Facundo, la de cosas que no sabía que existían.
Muchas gracias, excelente manual y me despejo las dudas de los 2 tipos de motores.
Muchas gracias por la info
Gracias Facundo!! Excelente complemento
Es muy bueno aprender acerca de esto. Esta genial este aporte!!!
¡Muchas gracias! Excelente aporte 😉
Excelente descripción de estos engine. Gracias
Muchas graciasss 😃
Sabía más o menos las diferencias, de lo que no estaba consciente era de que pueden variar de tabla en tabla en un mismo esquema, fabuloso.
Buen aporte
Excelente!
Hola, una consulta, que debería realizar en el caso que tenga una tabla que recibirá gran cantidad de inserts y updates. Sin embargo, también deberá ser cargar rapido?
Recomendaría que uses InnoDB si quieres mantener tu información lo más estable y a prueba de fallas posible. Si es información muy volátil, como por ejemplo sobre transacciones que van a borrarse en algún tiempo o llevarse a un Data Warehouse, usaría MyISAM. Espero haber resuelto tu duda 😉
Excelente contenido, gracias por tu aporte 😄
Excelente articulo! Segun yo entiendo InnoDB, el rey de la escritura para hacer un fuerte uso de INSERT & UPDATE y MyISAM, el rey de la lectura, que darà una respuesta rápida hacia las lecturas de datos.
Y por què no los dos?
gracias por el post , aclare muchas dudas.
Increíble aporte del Gran Facundo,
Enorme Teacher!!
Enorme Hater!!
Un aporte muy valioso, me quedo claro y terminaré de aclarar el concepto con la práctica. Pero ya de lleno esta nformación ayuda bastante
Genial publicación, gracias…
Muy claros los conceptos, muchas gracias!
Muchas gracias. 😃
Muy buen post. De hecho, que exista este comentario en la clase me enseñó cómo se escriben los nombres de los motores. El profesor lo pronuncia, pero no hay forma de saber cómo se escribe sólo escuchándolo.
Muchas gracias!!!
excelente, no entendí nada lo q se dicto en la clase hasta q leí tu tutorial, gracias
Muchas gracias, todo esta muy bien estructurado que queda muy claro =D.
Ojala hubiera tenido conocmiento de esta info hace unos 3 años, me hubiera resuelto muchos dolores de cabeza. Gracias bro
Creo que apenas habia escuchado los nombres, gracias por ayudarme a aclarar los ocnceptos
Gracias por el aporte, complementa mucho la clase en donde vi el post.
Excelente explicacion
Tengo una pregunta
¿Cuando ya la tabla está creada hay una consulta que me muestre si es InnoDB o MyIsam?
¿Una vez está creada la tabla se puede cambiar?
A pesar de que MongoDb y otras tecnoogias no relacionales estan en auge, sigo pensando que MySQL es bastante poderoso y bastante fácil de manejar.
Soy de la vieja escuela por lo que adaptarme a estas nuevas teconologías, despues de aaaaños de manejar MySQL ha sido un poco complejo, sin embargo no por esto dejo de aprender cosas nuevas, no se, tal vez en un futuro cercano pueda decir que Mongo es mejor que MySql 😄 jeje
Excelente, gracias por el aporte
gracias por el aporte
Muy buen aporte !
Gracias, es un buen aporte y complemento para el curso de SQL y MySQL
Excelentísimo aporte 😃. Gracias
¡Excelente aporte!
excelente aporte.
Gracias por el aporte 😃 me ayudó mucho a comprender mejor el tema.
Genial de los mejores tutoriales, justo vengo del curso de SQL