Optimizar automáticamente tu base de datos

Una de las lecciones que se propagó por la blogósfera hispanoparlante tras el caos producido por los anuncios de alto consumo de CPU por parte de WordPress es la importancia de mantener una base de datos optimizada. Sin embargo, como bloggers, seguramente pasamos más tiempo frente a un formulario para escribir posts que preocupándonos de este tipo de detalles. Por suerte, existen formas de automatizar este proceso.

¿Por qué optimizar?

Fue Marcos Sader quien destacó el peso fundamental de esta acción: en su post sobre “acelerar” WordPress, reporta un descenso en el consumo de CPU de alrededor de 200 minutos tras optimizar la base de datos. Pero ¿qué es esto, en definitiva?

Yo mismo no lo se muy bien, por lo que me he remitido a la documentación de MySQL, en el que nos indican lo siguiente:

OPTIMIZE TABLE debe ser usado si ha borrado una gran parte de una tabla o si ha hecho muchos cambios a una tabla con filas de longitud variable (tablas que tienen columnas VARCHAR, BLOB o TEXT). Los registros borrados son mantenidos en una lista enlazada y las subsecuentes operaciones INSERT reusan las posiciones de los registros anteriores. Puede utilizar OPTIMIZE TABLE para reclamar ese espacio inutilizado y para desgragmentar el archivo con los datos.

MySQL 3.23, 4.0, 4.1 Reference Manual :: 13.5.2.5 OPTIMIZE TABLE Syntax

Optimizar automáticamente

Debo apuntar que este método se basa en el uso de Cron, un administrador regular de procesos en segundo plano (“demonio”) que ejecuta programas a intervalos regulares (por ejemplo, cada minuto, día, semana o mes), por lo que sólo servirá a quienes tengan acceso a SSH u otra forma de instalar trabajos periódicos. Dicho esto, los pasos para instalar un trabajo que optimize nuestra base de datos periódicamente son los siguientes:

  1. Primero, debemos crear un archivo que contenga las instrucciones para optimizar nuestra base de datos. Llamémosle optimize.sql, y lo dejaremos en nuestro directorio de usuario (generalmente, algo así como /home/usuario/
  2. Las instrucciones que debe contener ese archivo son las siguientes:

    USE basededatos;
    OPTIMIZE TABLE 'wp_categories' , 'wp_comments' , 'wp_linkcategories' , 'wp_linkfeeds' , 'wp_links' , 'wp_options' , 'wp_post2cat' , 'wp_postmeta' , 'wp_posts' , 'wp_users';

    Esas son todas las tablas que tiene por defecto una instalación de WordPress (y quizás alguna que se me haya pasado y que sea de algún plugin). Por supuesto, hay que cambiar basededatos por el nombre de tu base de datos.

  3. Lo siguiente es crear el cron. Para ello, nos conectamos vía SSH y tecleamos crontab -e.
  4. Una vez ahí, creamos el cronjob, de una manera similar a la siguiente:

    * * * * 4 mysql -u usuario_de_mysql -p password_de_mysql -h mysql.example.com </home/usuario/optimize.sql >/dev/null 2>&1

    Todo esto debe ir en una sola línea, reemplazando los valores que correspondan (en negritas) por los que correspondan a nuestro caso.

  5. Guardamos el trabajo, y listo. Podemos comprobar si quedó instalado ejecutando crontab -l
  6. El ejemplo citado hace que todos los jueves se ejecute el archivo optimize.sql, el que optimiza las tablas de nuestra instalación de WordPress. En caso de tener más tablas que las que vienen por defecto (lo que sucede, por ejemplo, si tienes instalado el plugin Bad Behavior) sólo debes agregarla a la lista. Esto es especialmente recomendable en casos de plugins anti-spam o de estadísticas.

Eso es todo. Ojalá les sirva. Si alguien sabe otros métodos (quizás con el plugin WP-Cron) o encuentra algún error, ¡no duden en comentarlo!