103

InnoDB y MyISAM: El ying yang de MySQL ☯🐬

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>

El diseño, el gran cuello de botella

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…

Los desconocidos, InnoDB y MyISAM

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:

InnoDB, el rey de la escritura

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;

MyISAM, el rey de la lectura

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.

Conclusión

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 😉

Escribe tu comentario
+ 2
Ordenar por:
16
15768Puntos

¡Muchas gracias por tu aporte! Lo acabo de leer y ahora me queda mucho más claro el concepto

2
42330Puntos
3 años

De nada eduardo! 😉

0
un año

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.

0
36958Puntos
un año

Hola lorerli cervances, yo tengo algo de tiempo laborando y no sabía sobre estos conceptos, así que siempre se aprende algo nuevo.

4
23959Puntos

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?

3
6488Puntos

gracias por el articulo

2
16023Puntos

Excelente contenido, gracias por tu aporte 😄

2
54877Puntos

Buen aporte

2
27821Puntos

Gracias Facundo!! Excelente complemento

2
8736Puntos

Gracias, después de leer este artículo es más clara la diferencia.

2
11938Puntos

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?

2
42330Puntos
3 años

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 😉

2
22999Puntos

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.

2
6967Puntos

Excelente descripción de estos engine. Gracias

2
9440Puntos

Es muy bueno aprender acerca de esto. Esta genial este aporte!!!

2
16014Puntos

Muchas gracias por la info

2
6263Puntos

Muchas gracias, excelente manual y me despejo las dudas de los 2 tipos de motores.

2
3886Puntos

Excelente Facundo, la de cosas que no sabía que existían.

2
55797Puntos

Muy claro todo, una herramienta más al tool de ingeniero de datos 😄

2
190Puntos

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?

2
60973Puntos

Bien por el articulo, desconocía que habían dos tipos de motores.

1
1168Puntos

Muchas gracias, todo esta muy bien estructurado que queda muy claro =D.

1
2218Puntos

Gracias por el aporte, complementa mucho la clase en donde vi el post.

1
5862Puntos

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?

1
6488Puntos

gracias por el aporte

1
1413Puntos

Ojala hubiera tenido conocmiento de esta info hace unos 3 años, me hubiera resuelto muchos dolores de cabeza. Gracias bro

1
7533Puntos

Excelente, gracias por el aporte

1
19698Puntos

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.

1
7576Puntos

excelente, no entendí nada lo q se dicto en la clase hasta q leí tu tutorial, gracias

1
360Puntos

MyISAM es el motor por defecto, InnoDB si se tiene que declarar. Pequeño gran detalle.

1

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

1
66844Puntos

Creo que apenas habia escuchado los nombres, gracias por ayudarme a aclarar los ocnceptos

0
8078Puntos

Genial de los mejores tutoriales, justo vengo del curso de SQL

0
13046Puntos

Gracias por el aporte 😃 me ayudó mucho a comprender mejor el tema.

0
4814Puntos

Gracias, es un buen aporte y complemento para el curso de SQL y MySQL

0
7999Puntos

excelente aporte.

0
7280Puntos

Excelentísimo aporte 😃. Gracias