Ocurre a menudo sobre todo en bases de datos antiguas que nuestras bases de datos ocupan demasiado espacio ya sea si utilizamos un blog en WordPress o realizamos un desarrollo propio.

Antes de realizar cualquier cambio en la base de datos recuerda hacer un respaldo de tu base de datos.

Optimizando la base de datos de WordPress

El método más sencillo para realizar una mantenimiento de la base de datos es utilizando un plugin como WP-Optimize que cuenta con algunas herramientas para realizar limpieza a nuestra base de datos, entre ellas limpiar revisiones, eliminar borradores, eliminar opciones caducas entre otras:

Algunas opciones de mantenimiento de base de datos de WP-Optimize

Si con estos cambios consideras que es suficiente es un buen inicio, lamentablemente estamos acostumbrados a utilizar ciertos plugins que también agregan peso a nuestra base de datos con información que solamente se utilizan en una ocasión como es el caso de one Signal o compartir de Jetpack por lo que debes revisar tu base de datos para encontrar los plugins que generan más peso a tu base.

A continuación ejemplos de algunas consultas que podemos utilizar para eliminar registros que no se utilizan más en nuestro WordPress como es el caso de resmushed y one signal :

DELETE FROM `wp_postmeta` WHERE `meta_key` = 'resmushed_quality' and `post_id` < 113144
DELETE FROM `wp_postmeta` WHERE `meta_key` = 'resmushed_cumulated_original_sizes' and `post_id` < 113144
DELETE FROM `wp_postmeta` WHERE `meta_key` = 'resmushed_cumulated_optimized_sizes' and `post_id` < 113144
DELETE FROM `wp_postmeta` WHERE `meta_key` = '_publicize_twitter_user' and `post_id` < 113144
DELETE FROM `wp_postmeta` WHERE `meta_key` = '_wpas_done_all' and `post_id` < 113144
DELETE FROM `wp_postmeta` WHERE `meta_key` = 'obfx-header-scripts' and `post_id` < 113144
DELETE FROM `wp_postmeta` WHERE `meta_key` = 'obfx-footer-scripts' and `post_id` < 113144
DELETE FROM `wp_postmeta` WHERE `meta_key` = 'onesignal_meta_box_present' and `post_id` < 113144
DELETE FROM `wp_postmeta` WHERE `meta_key` = 'onesignal_send_notification' and `post_id` < 113144
DELETE FROM `wp_postmeta` WHERE `meta_key` = 'onesignal_modify_title_and_content' and `post_id` < 113144
DELETE FROM `wp_postmeta` WHERE `meta_key` = 'onesignal_notification_custom_heading' and `post_id` < 113144
DELETE FROM `wp_postmeta` WHERE `meta_key` = 'onesignal_notification_custom_content' and `post_id` < 113144

El post_id lo puedes tomar de la tabla wp_post, recuerda estas consultas solamente aplican en mi caso específico y debes revisar tu base para conocer tu caso.

Si aun utilizas tablas MyISAM en lugar de InnoDB te recomiendo hacer el cambio, para ello te comparto un ejemplo de una modificación a realizar debido al tamaño excesivo de la base de datos que superaba los 4GB siendo que nuestro PHPMyAdmin nos muestra que los datos ocupan menos de 100 MB en total debido a lo que se ha eliminado.

¿Por qué ibdata1 es tan pesado?

En nuestro servidor podemos ver que el tamaño del fichero ibdata1 ubicado en /var/lib/mysql crece y al parecer nunca se reduce, este archivo es creado si utilizamos MyISAM, este fichero guarda, por defecto, los metadatos de InnoDB, el buffer de cambios, el buffer de doble escritura, los undo logs y los datos de las tablas en InnoDB.

Este fichero crece de tamaño cada que se realizan movimientos, cambios en las tablas, etc, pero nunca disminuye de tamaño, por lo que si, por ejemplo, un día añadimos como en mi caso 4 gb en información en una tabla ibdata1 aumentará en consecuencia, y si al día siguiente borramos esos 4 gb, ibdata1 permanecerá con el mismo tamaño, aunque si agregamos datos el tamaño se mantendrá porque al parecer contamos con ese espacio disponible.

Dando mantenimiento a la base de datos

Recuerden antes de cualquier cosa hacer un respaldo de su base de datos

Lo primero que haré será modificar las tablas y cambiar el motor de base de datos a InnoDB para ello utilizaremos la siguiente consulta, antes de hacer esto revisa las diferencias entre los motores y si realmente es la solución en tu caso

ALTER TABLE <nombre de la tabla> ENGINE=InnoDB; 

Esta es parte de nuestra base como podemos ver la mayoría utilizan MyISAM:

El resultado de la consulta sería algo así:

Si quieres listar todas las tablas que utilizan MyISAM puedes usar esta consulta:

SELECT table_schema,table_name FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','performance_schema','mysql') and engine='MyISAM'

Repetimos en todas las tablas coincidentes y revisamos nuevamente la información, realizamos un nuevo respaldo y si queremos asegurarnos de eliminar todo lo que no utilizamos simplemente eliminamos la base de datos, creamos una nueva y cargamos el nuevo respaldo, en mi caso ahorrando poco más de 4GB ya que elimine muchos datos anteriormente.

Si tienes una duda en específico o necesitas ayuda para optimizar tu base de datos puedes hacer contacto.