¿Necesitas convertir tus tablas de InnoDB a MyISAM?

  • WordPress - Blog

¿Necesitas convertir tus tablas de InnoDB a MyISAM?

Si tu base de datos aumenta su tamaño sin motivo aparente, o si tarda más de lo habitual en procesar cualquier consulta, es más que probable que necesites cambiar tus tablas de InnoDB a MyISAM.

Aunque el primer mecanismo de almacenamiento de MySQL es más fiable, consistente y robusto que el segundo, nos hemos encontrado con no pocos sitios web en los que provoca graves problemas de rendimiento y crecimiento desmesurado de las tablas, especialmente en las tablas wp_options, wp_posts y wp_postmeta.

Estos problemas los hemos detectado en sitios web alojados bajo Parallels Plesk Panel, cPanel y Vesta Control Panel, por lo que es independiente del tipo de panel de control que use tu servidor e incluso de las versiones de MySQL, PHP o WordPress que tengas instaladas.

¿Cómo lo hacemos?

En principio podemos hacerlo de dos formas.

En primer lugar podemos crear un simple archivo PHP en el directorio raíz de WordPress al que llamaremos cambia-tablas.php, por ejemplo, y en el que incluiremos este simple, sencillo, pero efectivo código PHP:

if ( file_exists( "./wp-load.php" ) ) {
	require_once( "./wp-load.php" );
} else {
	exit( '<HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD><BODY><H1>No encontrado</H1>Por favor, asegurate de que cambia-tablas.php está ubicado en el directorio raíz.</BODY></HTML>' );
}

$consulta = $wpdb->get_results( "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
	WHERE TABLE_SCHEMA = '" . DB_NAME . "'" );

foreach ( $consulta as $fila ) {
	$nombre_fila = $fila->TABLE_NAME;
	$nueva_consulta = $wpdb->query( "ALTER TABLE `$nombre_fila` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;" );
}
echo "Proceso terminado en " . DB_NAME;


$consulta = $wpdb->get_results( "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
	WHERE TABLE_SCHEMA = '" . DB_NAME . "'" );

foreach ( $consulta as $fila ) {
	$nombre_fila = $fila->TABLE_NAME;
	$nueva_consulta = $wpdb->query( "ALTER TABLE `$nombre_fila` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;" );
}
echo "Proceso terminado en " . DB_NAME;

También podemos hacerlo ejecutando esta consulta SQL directamente en nuestro phpMyAdmin, MySQL Workbench o MySQL Utilities, por ejemplo:

SET @DATABASE_NAME = 'base_de_datos';

SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;') AS sql_statements
FROM    information_schema.tables AS tb
WHERE   table_schema = @DATABASE_NAME
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;

Donde sólo debemos cambiar base_de_datos por el nombre que tenga nuestra propia base de datos y la consulta nos devolverá una tabla con varias sentencias ALTER, concretamente un listado parecido a este:

ALTER TABLE `wp_users` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `wp_usermeta` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `wp_term_taxonomy` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `wp_term_relationships` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `wp_terms` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `wp_posts` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `wp_postmeta` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `wp_options` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `wp_links` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `wp_comments` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `wp_commentmeta` ENGINE = MYISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Una vez obtenido el listado de sentencias, sólo debemos copiarlas todas y ejecutarlas dentro de la base de datos a la que queremos convertirle las tablas de InnoDB a MyISAM.

Fíjate que además de convertir las tablas a MyISAM les forzamos el cotejamiento a UTF-8, concretamente a utf8_general_ci, lo que hará que nos libremos de caracteres extraños en nuestra base de datos.

Beneficios

Los beneficios que hemos obtenido al realizar estas modificaciones han sido dos.

Por un lado hemos logrado adelgazar bases de datos que tenían varios GB de tamaño a unos cuantos cientos de MB. El motivo es que las tablas InnoDB no permiten su optimización, y hace que en ocasiones se llenen de registros innecesarios.

Y por otro hemos logrado rebajar considerablemente los tiempos de procesamiento de algunas consultas hasta en un 74%. Normalmente motivado por el mismo tamaño desmesurado de las tablas. Al eliminar esa gran cantidad de registros innecesarios, reducimos considerablemente los tiempos de procesamiento de esas consultas.

Conclusión

Si estás sufriendo alguno de los problemas descritos, prueba a utilizar este pequeño truco sobre tu base de datos. Si el problema persiste, entonces deberías dejar tu sitio web en manos de un especialista en WordPress como APG.

4 Comentarios

  1. ComeFruta (@comefruta_es) Miércoles, 16 de Septiembre de 2015 en 8:23- Responder

    Muy útil. En nuestro ecommerce ha mejorado mucho la velocidad y reducido el espacio.

  2. PACO Miércoles, 16 de Septiembre de 2015 en 8:58- Responder

    Me parece miserable el que tenga que compartir para poder leer… Es la primera vez que lo veo y espero que se la última.
    No pienso volver por su página.

  3. VerdeMagenta Jueves, 24 de Septiembre de 2015 en 10:29- Responder

    no me parece mala idea el tener que compartir para observar toda la información, logran hacer que sea opcional y no agresivo,con respecto al articulo muy util!

Deje un comentario

Comparte esto con un amigo