{"id":473,"date":"2014-09-30T10:17:00","date_gmt":"2014-09-30T08:17:00","guid":{"rendered":"http:\/\/dbahire.com\/?p=473"},"modified":"2016-10-29T01:57:08","modified_gmt":"2016-10-28T23:57:08","slug":"hoy-es-el-dia-en-que-myisam-ha-dejado-de-ser-necesario","status":"publish","type":"post","link":"https:\/\/jynus.com\/dbahire\/hoy-es-el-dia-en-que-myisam-ha-dejado-de-ser-necesario\/","title":{"rendered":"Hoy es el d\u00eda en que MyISAM ha dejado de ser necesario"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2014\/09\/RIP_myisam.png\" alt=\"RIP MyISAM\" width=\"250\" height=\"304\" class=\"alignright size-full wp-image-453\" \/>Por supuesto, esto s\u00f3lo es un t\u00edtulo para llamar la atenci\u00f3n. Por lo que yo s\u00e9 no todas las tablas de sistema se pueden convertir a InnoDB <em>todav\u00eda<\/em> (por ejemplo, las tablas de privilegios), lo cual convierte la cabecera en t\u00e9cnicamente falsa. MyISAM es un motor muy simple, y eso tiene algunas ventajas inherentes (no hay carga extra debido a las transacciones, m\u00e1s f\u00e1cil de &#8220;editar&#8221; manualmente, normalmente ocupa menos espacio en disco), pero tambi\u00e9n algunas desventajas bastante importantes: no es seguro en el caso de un cuelgue general, no hay claves for\u00e1neas, s\u00f3lo bloqueos a nivel de tabla, problemas de consistencia, bugs en tablas muy grandes,&#8230; La <a href=\"http:\/\/dev.mysql.com\/doc\/relnotes\/mysql\/5.7\/en\/news-5-7-5.html\">versi\u00f3n 5.7.5 &#8220;Milestone 15&#8221;<\/a>, <a href=\"http:\/\/www.oracle.com\/us\/corporate\/press\/2301480\">presentada hoy en el Oracle Open World<\/a> tiene <a href=\"http:\/\/mysqlserverteam.com\/the-mysql-5-7-5-milestone-release-is-available\/\">una impresionante lista de cambios<\/a>, la cual necesitar\u00e9 un tiempo para digerir, como una replicaci\u00f3n multi-master (<a href=\"https:\/\/twitter.com\/andrewmorgan\/status\/515196774852874241\">\u00bfsyncrona?<\/a>) en fase de desarrollo o un completamente cambiado optimizador de consultas. Pero el cambio en particular que quiero destacar hoy es que la \u00faltima de las &#8220;3 grandes&#8221; razones para usar MyISAM ha desaparecido finalmente. Para m\u00ed (y mis clientes) esas razones eran:<\/p>\n<p><strong>Espacio de tablas transportable<\/strong><\/p>\n<p>En MyISAM, mover una tabla en formato binario de una servidor a otro era (y sigue siendo) muy f\u00e1cil- tirar el servidor y copiar los archivos <code>.MYI<\/code>, <code>.MYD<\/code> y <code>.frm<\/code>. Incluso se podr\u00eda hacer en caliente con las debidas precauciones: se pod\u00eda copiar los ficheros de tabla si se ejecutaba antes el infame &#8220;<code>FLUSH TABLES WITH READ LOCK;<\/code>&#8221; y usar eso como una backup.<\/p>\n<p><code>innodb_file_per_table<\/code> fue <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/4.1\/en\/innodb-multiple-tablespaces.html\">introducido tan pronto como MySQL 4.1<\/a>, pero no fue puesto como por opci\u00f3n por defecto <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.6\/en\/innodb-parameters.html#sysvar_innodb_file_per_table\">hasta 5.6.6<\/a> (con una breve indecisi\u00f3n en las versiones tempranas de 5.5). <strong>La verdadera funcionalidad de &#8220;espacio de trablas transportables&#8221; tambi\u00e9n fue a\u00f1adida en 5.6.6<\/strong>, y proporcion\u00f3 <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.6\/en\/innodb-migration.html#copy-tables-transportable-tablespaces\">una manera dentro del servidor de preparar las tablas para la copia, bloque\u00e1ndolas y exportando su porci\u00f3n del diccionario de datos de InnoDB<\/a> (<code>FLUSH TABLES ... FOR EXPORT<\/code>).<\/p>\n<p>Antes de 5.6, <a href=\"http:\/\/www.percona.com\/doc\/percona-server\/5.5\/management\/innodb_expand_import.html#innodb_import_table_from_xtrabackup\">MySQL requer\u00eda una parche<\/a> para que esto funcionara de manera segura. Ahora, tablas individuales pueden exportarse e importarse sin problemas en formato binario, incluso entre diferentes servidores.<\/p>\n<p><strong>\u00cdndices Fulltext<\/strong><\/p>\n<p>La b\u00fasqueda de cadenas de texto <em>fulltext<\/em> nunca ha sido el punto fuerte de MySQL (y he ah\u00ed la raz\u00f3n por la que mucha gente lo combina con Sphinx o Apache Lucene\/Solr). Pero muchos usuarios no requieren un clon de Google Search, s\u00f3lo una manera r\u00e1pida de buscar en una web peque\u00f1ita, o en una columna de descripci\u00f3n, y como sabemos, los \u00edndices <code>BTREE<\/code> no son \u00fatiles en expresiones como <code>like '%palabra_buscada%'<\/code>.<\/p>\n<p>Los \u00edndices y b\u00fasquedas <code>FULLTEXT<\/code> <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/4.1\/en\/fulltext-search.html\">han estado disponibles desde MySQL 3.23.23<\/a>, pero s\u00f3lo para MyISAM. Yo no s\u00e9 vosotros, pero yo he encontrado un relativo alto n\u00famero de clientes cuya \u00fanica raz\u00f3n para seguir usando MyISAM era &#8220;necesitamos b\u00fasquedas fulltext&#8221;. <strong><a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.6\/en\/fulltext-search.html\">A partir de MySQL 5.6.4<\/a>, el soporte a fulltext fue a\u00f1adido a InnoDB<\/strong>, eliminando la necesidad de decidir entre la transaccionalidad y la b\u00fasqueda r\u00e1pida de cadenas. A pesar de que <a href=\"http:\/\/www.slideshare.net\/billkarwin\/practical-full-text-search-with-my-sql\/64\">los comienzos no fueran precisamente geniales<\/a>, (especialmente si los comparamos con otras soluciones externas y m\u00e1s complejas) y que fue publicado con algunos bugs importantes que afectaban a la estabilidad; los \u00faltimos cambios en el soporte de fulltext en innodb indican que se sigue trabajando para mejorar su rendimiento.<\/p>\n<p><strong>Soporte a GIS<\/strong><\/p>\n<p><strong>\u00c9ste es cambio que los ingenieros de MySQL a\u00f1adieron en MySQL 5.7.5.<\/strong> Por supuesto, los tipos de datos GIS estaban disponibles <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/4.1\/en\/spatial-extensions.html\">desde MySQL 4.1 para MyISAM<\/a>, y <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.0\/en\/spatial-extensions.html\">en 5.0.16 para la mayor\u00eda de otros motores de primeras partes<\/a>, incluyendo InnoDB. Sin embargo, esos tipos no son \u00fatiles si no se pueden utilizar de manera r\u00e1pida en operaciones geogr\u00e1ficas comunes como encontrar si dos pol\u00edgonos se solapan o encontrar todos los puntos que est\u00e1n cerca de otro dado. La mayor\u00eda de estas operaciones requieren el indexado en 2 dimensiones, algo que no funciona muy bien con \u00edndices BTREE est\u00e1ndares. Para ello, necesitamos <a href=\"http:\/\/en.wikipedia.org\/wiki\/R-tree\">R-Trees<\/a> o Quadtrees, estructuras que nos permitir\u00e1n el indexado eficiente de valores multidimensionales. Hasta ahora, esos \u00edndices de tipo <code>SPATIAL<\/code>, como se les llama en sintaxis MySQL, s\u00f3lo estaban disponibles en MyISAM- de forma que de nuevo ten\u00edamos que decidir entre transacciones y claves for\u00e1neas o operaciones GIS eficientes. Esta es una de las razones por las cuales proyectos como OpenStreetMap migraron a PostGIS, mientras que otros usaban las <em>Oracle Spatial Extensions<\/em>.<\/p>\n<p>Para ser sinceros, la <a href=\"http:\/\/mysqlserverteam.com\/the-mysql-5-7-5-milestone-release-is-available\/\">lista de cambios referentes a GIS parece bastante extensa<\/a>, y he sido todav\u00eda incapaz de echarle un vistazo en detalles. Pero puedo ver que todav\u00eda <a href=\"http:\/\/www.slideshare.net\/henrikingo\/spatial-functions-in-mysql-56-mariadb-55-postgis-20-and-others\/25\">no hay soporte a proyecciones<\/a> (despu\u00e9s de todo, eso requerir\u00eda probablemente rehacer por completo esta caracter\u00edstica), y con ello, tampoco funciones nativas de distancia, lo cual hace que no sea una alternativa viable a PostGIS en muchos escenarios. Pero tengo que otorgar que el soporte a InnoDB, al menos a nivel de MyISAM y m\u00e1s all\u00e1 es un gran paso adelante. De nuevo, a veces no necesitas un conjunto de caracter\u00edsticas completo para la mayor\u00eda de la audiencia de MySQL, sino un conjunto de opciones m\u00ednimas para mostrar de manera eficiente un mapa en una p\u00e1gina web.<\/p>\n<p><strong>MyISAM en un mundo post-myisam<\/strong><\/p>\n<p>En resumen, estos cambios, unidos con una lenta pero segura migraci\u00f3n de las tablas de sistema a formato InnoDB, junto con los esfuerzos por reducir la carga transaccionar de las tablas temporales internas, permitir\u00e1 a Oracle hacer MyISAM opcional en un futuro.<\/p>\n<p>Yo mismo continuar\u00e9 usando MyISAM en ciertos casos ya que a veces uno no necesita almacenamiento <em>ACID<\/em>, y funciona particularmente para conjuntos de datos peque\u00f1os y de solo lectura -incluso si tienes millones de esos (ey, <em>les funciona<\/em> a <a href=\"http:\/\/www.percona.com\/live\/london-2013\/sessions\/scaling-500000000-database-tables-and-beyond-wordpresscom-story\">WordPress.com<\/a>, as\u00ed que \u00bfpor qu\u00e9 no seguir us\u00e1ndolo tambi\u00e9n?).<\/p>\n<p>Adem\u00e1s, la gente tardar\u00e1 a\u00f1os en adoptar 5.7, que no est\u00e1 ni siquiera en GA release (versi\u00f3n considerada para uso general).<\/p>\n<p>Contadme \u00bfplane\u00e1is migrar de motores cuando 5.7 llegue a tu producci\u00f3n? \u00bfPara qu\u00e9 sigues usando MyISAM? \u00bfCu\u00e1l es tu caracter\u00edstica nueva favorita de 5.7.5? \u00bfQu\u00e9 peros hab\u00e9is encontrado en las nuevas caracter\u00edsticas anunciadas? Dejadme un mensaje <a href=\"http:\/\/dbahire.com\/today-is-the-day-in-which-myisam-is-no-longer-needed\/#disqus_thread\">aqu\u00ed<\/a> o en <a href=\"https:\/\/twitter.com\/dbahire_es\">Twitter<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Por supuesto, esto s\u00f3lo es un t\u00edtulo para llamar la atenci\u00f3n. Por lo que yo s\u00e9 no todas las tablas de sistema se pueden convertir a InnoDB todav\u00eda (por ejemplo, las tablas de privilegios), lo cual convierte la cabecera en<\/p>\n","protected":false},"author":1,"featured_media":453,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[85],"tags":[179,180,175,176,178,181,182,183,184,457,185,177,186],"class_list":["post-473","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mysql-es","tag-5-7-5-es","tag-5-7-5-m15-es","tag-busqueda","tag-cadenas","tag-espacio-de-tablas","tag-fulltext-es","tag-gis-es","tag-innodb-es","tag-myisam-es","tag-mysql-es","tag-spatial-es","tag-tablespace","tag-transportable-es"],"_links":{"self":[{"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/posts\/473","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/comments?post=473"}],"version-history":[{"count":2,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/posts\/473\/revisions"}],"predecessor-version":[{"id":811,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/posts\/473\/revisions\/811"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/media\/453"}],"wp:attachment":[{"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/media?parent=473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/categories?post=473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/tags?post=473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}