{"id":929,"date":"2013-10-20T16:10:15","date_gmt":"2013-10-20T15:10:15","guid":{"rendered":"http:\/\/www.sortea2.com\/blog\/?p=929"},"modified":"2013-10-20T16:10:15","modified_gmt":"2013-10-20T15:10:15","slug":"10-razones-para-elegir-innodb-como-motor-de-almacenamiento-de-mysql","status":"publish","type":"post","link":"https:\/\/www.sortea2.com\/blog\/2013\/10\/10-razones-para-elegir-innodb-como-motor-de-almacenamiento-de-mysql\/","title":{"rendered":"10 razones para elegir InnoDB como motor de almacenamiento de MySQL"},"content":{"rendered":"<p>Una de las preguntas m\u00e1s frecuentes al crear una tabla de MySQL es \u00bfqu\u00e9 elijo, MyISAM o InnoDB? Mucha gente decide de forma un poco aleatoria. Tanto MyISAM como InnoDB son <strong>motores de almacenamiento<\/strong>. El motor de almacenamiento es la capa de software que se coloca debajo del motor de consultas (la parte que se encarga de analizar y optimizar las consultas de SQL). Se encarga de hacer todo el trabajo \u00absucio\u00bb de localizar cada byte en el soporte f\u00edsico, de asegurarse de que se cumplen las restricciones de integridad, de la concurrencia, etc.<\/p>\n<p>Esta es la parte m\u00e1s compleja del sistema gestor de bases de datos, se compone de cientos de miles de l\u00edneas de c\u00f3digo altamente optimizado. Cada motor de almacenamiento soporta unas caracter\u00edsticas diferentes.<\/p>\n<ul>\n<li><strong>MyISAM<\/strong>: motor de almacenamiento simplificado. Trabaja con los datos de una forma m\u00e1s \u00abrelajada\u00bb, con el objetivo de simplificar su uso y tratar de mejorar el rendimiento. Normalmente las tablas ocupar\u00e1n menos espacio en disco. Suelen ser m\u00e1s r\u00e1pidas para consultas de datos. Su contrapartida es que no sigue las <a href=\"http:\/\/es.wikipedia.org\/wiki\/12_reglas_de_Codd\">12 reglas de Codd<\/a>, no tiene control de claves for\u00e1neas, transacciones, su control de la concurrencia es muy limitado, etc..<\/li>\n<li><strong>InnoDB<\/strong>: motor m\u00e1s sofisticado que cumple con las reglas del modelo relacional bastante a rajatabla. Por ello, garantiza una mayor durabilidad en los datos. En sus inicios se criticaba que a\u00f1ad\u00eda muchas caracter\u00edsticas pero era mucho m\u00e1s lento que MyISAM. Esto ya no es un problema y en determinadas circunstancias le supera en rendimiento (sobre todo en modificaciones concurrentes de datos y en consultas indexadas por clave primaria).<\/li>\n<\/ul>\n<p>Lo m\u00e1s importante es <strong>no mezclar tablas de distintos motores de almacenamiento<\/strong>. De lo contrario hacer un JOIN entre dos tablas de distinto tipo el rendimiento ser\u00e1 p\u00e9simo. MySQL tratar\u00e1 de optimizarlo lo m\u00e1s posible, pero no podr\u00e1 hacer milagros. Es posible que tenga sentido tener alguna tabla de un tipo distinto en determinadas circunstancias. Por ejemplo, podemos tener los datos vitales en tablas InnoDB y tener tablas con logs\/registros en MyISAM porque no requieren de mucha complejidad.<\/p>\n<p>A continuaci\u00f3n detallaremos diez razones por las cuales InnoDB puede ser la opci\u00f3n correcta frente a MyISAM:<\/p>\n<ol>\n<li>\u00a0<strong>Soporte de claves for\u00e1neas<\/strong>. InnoDB permite relacionar tablas de forma impl\u00edcita en la base de datos. Esto har\u00e1 que la propia base de datos se encargue de eliminar inconsistencias en los datos. Con MyISAM tendr\u00edamos que \u00abasumir\u00bb las claves for\u00e1neas, pero podr\u00edamos obtener registros inv\u00e1lidos. Por ejemplo, no podemos asegurarnos de que si borramos un producto, primero tengamos que borrar las categor\u00edas asociadas al mismo. Con MyISAM podr\u00edamos borrar un producto y la tabla de producto_categoria quedar\u00eda con registros hu\u00e9rfanos.<\/li>\n<li><strong>Control de concurrencia de alto nivel. <\/strong>En MyISAM cuando una transacci\u00f3n modifica un registro de una tabla, la tabla entera queda bloqueada mientras se realice la modificaci\u00f3n. Cualquier otra transacci\u00f3n que se realice mientras tanto tendr\u00e1 que esperar. Eso puede crear cuellos de botella. Es muy com\u00fan ver listas de procesos con cientos de INSERTs que est\u00e1n esperando a otro que se ha quedado atascado. Ante eso poco m\u00e1s se puede hacer que reiniciar el servidor o matar los procesos. InnoDB en cambio, proporciona un sistema de <strong>bloqueos a nivel de fila<\/strong>, lo que significa que solamente la fila que est\u00e1 siendo modificada queda bloqueada. Otras transacciones tratando de modificar la misma tabla podr\u00edan funcionar siempre y cuando modifiquen a otros registros. Modificar una tabla de forma concurrente es altamente probable. Modificar un mismo registro simult\u00e1neamente es mucho menos com\u00fan.<\/li>\n<li><strong>Bajo \u00edndice de tablas corruptas<\/strong>. Esto es debido en parte al punto 2. Debido al mal control de concurrencia de MyISAM, es muy habitual encontrarse con tablas corruptas si una transacci\u00f3n falla. En InnoDB se cumple la norma de que cualquier transacci\u00f3n llevar\u00e1 a la base de datos de un estado v\u00e1lido a otro estado v\u00e1lido. Muy raramente encontraremos una tabla InnoDB corrupta. Aunque cabe mencionar que reparar una tabla MyISAM es trivial mientras que en InnoDB puede llegar a ser una pesadilla.<\/li>\n<li><strong>Soporte de transacciones<\/strong>. InnoDB soporta las transacciones. Es posible enviar una serie de consultas que se ejecuten de forma unificada. As\u00ed podemos crear aplicaciones con alto \u00edndice de fiabilidad, porque podemos asegurarnos de que no dejamos una operaci\u00f3n a medio hacer. Cabe destacar que por defecto, el par\u00e1metro \u00abautocommit\u00bb est\u00e1 activado, as\u00ed que si queremos utilizarlas tendremos que o bien especificarlo (<a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.0\/es\/commit.html\">ver c\u00f3mo<\/a>) o desactivar esa opci\u00f3n.<\/li>\n<li><strong>\u00cdndices clusterizados<\/strong>. Los datos se almacenan f\u00edsicamente por orden (alfab\u00e9tico o num\u00e9rico seg\u00fan se aplique) del valor de la clave primaria. Consultas que filtren \u00fanicamente por la clave primaria ser\u00e1n extremadamente eficientes, porque con saber el valor que buscamos, InnoDB con un par de operaciones ya puede saber d\u00f3nde se encuentra el dato.<\/li>\n<li><strong>Mejores opciones de replicaci\u00f3n<\/strong>. La replicaci\u00f3n consiste en copiar los datos de MySQL en varios servidores para repartir el trabajo a la hora de realizar consultas de datos. Al usar la replicaci\u00f3n es fundamental que todos los nodos (servidores con copia de la base de datos) tengan una copia consistente de los datos, de lo contrario cada nodo podr\u00eda devolver resultados distintos. Esto s\u00f3lo lo puede garantizar InnoDB mediante sus transacciones y su avanzado sistema de bloqueos.<\/li>\n<li><strong>M\u00e1s escalabilidad. <\/strong>Las tablas MyISAM frecuentemente quedan bloqueadas y\/o corruptas. En una tabla que almacene 200 registros esto puede ser un problema menor, porque repararla llevar\u00eda dos segundos. En una tabla con 20 millones de registros y que ocupe 2GB de espacio en disco esto es inaceptable. Podr\u00edamos dejar la aplicaci\u00f3n inutilizada durante horas. Si predecimos que nuestra tabla crecer\u00e1 mucho en tama\u00f1o o en requisitos de acceso, deber\u00edamos considerar a InnoDB como opci\u00f3n.<\/li>\n<li><strong>Motor <a href=\"http:\/\/es.wikipedia.org\/wiki\/ACID\">ACID compliant<\/a><\/strong>. Estas son las siglas de Atomicidad, Consistencia, Aislamiento y Durabilidad. La base de datos siempre va de un estado v\u00e1lido a otro estado v\u00e1lido.<\/li>\n<li><strong>Tablas sin l\u00edmite de tama\u00f1o<\/strong>. En MyISAM cada tabla se guarda en un archivo por separado. Si la tabla supera los 2GB es posible que el sistema de archivos del sistema operativo no sea capaz de utilizarlo. InnoDB se encarga de que las tablas no tengan l\u00edmite de tama\u00f1o. Para ello es posible que necesite dividir los datos en ficheros m\u00e1s peque\u00f1os. MyISAM no cuenta con esas caracter\u00edsticas y tiene que depender 100% del sistema de archivos.<\/li>\n<li><strong>\u00cdndices hash adaptables<\/strong>. Si un \u00edndice cabe en la memoria RAM y una tabla es consultada frecuentemente, es posible que InnoDB cree autom\u00e1ticamente un \u00edndice hash en memoria. Lo que hace es replicar el \u00edndice que se guarda en disco en la memoria RAM, de tal manera que los accesos tengan una velocidad muy superior. Es un sistema muy complejo que puede aumentar el rendimiento de las consultas significativamente.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Una de las preguntas m\u00e1s frecuentes al crear una tabla de MySQL es \u00bfqu\u00e9 elijo, MyISAM o InnoDB? Mucha gente decide de forma un poco aleatoria. Tanto MyISAM como InnoDB son motores de almacenamiento. El motor de almacenamiento es la capa de software que se coloca debajo del motor de consultas (la parte que se [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59,5],"tags":[],"class_list":["post-929","post","type-post","status-publish","format-standard","hentry","category-mysql-2","category-tutoriales"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/929","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/comments?post=929"}],"version-history":[{"count":12,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/929\/revisions"}],"predecessor-version":[{"id":941,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/929\/revisions\/941"}],"wp:attachment":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/media?parent=929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/categories?post=929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/tags?post=929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}