Optimizar las bases de datos de WordPress

Generalidades

Los sitios de WordPress se componen de dos componentes principales: los archivos del sitio web y la base de datos. Los archivos del servidor web contienen cosas como imágenes, plugins y archivos de temas, y los archivos principales de WordPress. La base de datos contiene cosas como el núcleo, el plugin y las opciones de tema, el contenido de la publicación, el contenido del usuario y las metatablas. Las herramientas en línea no pueden acceder a la base de datos, y es posible tener una puntuación alta en estas herramientas con un bajo rendimiento de la base de datos. El siguiente artículo detalla varios métodos para optimizar la base de datos de un sitio de WordPress.

Este artículo usará wp-cli para optimizar la base de datos. Necesitarás iniciar sesión en tu servidor vía SSH y navegar al directorio WordPress de tu sitio web para correr esos comandos.

Adicionalmente, asegúrate de hacer una copia de seguridad de tu base de datos antes de hacer una acción destructiva.

La tabla de options

La tabla options contiene datos importantes del sitio de WordPress, como la URL del sitio, la ruta y la configuración guardada. También contiene configuraciones de plugins y temas, junto con datos transitorios (temporales). Con el tiempo, esta tabla puede llenarse de datos transitorios con temporizadores de vencimiento prolongados y configuraciones sobrantes de plugins desinstalados.

Eliminar transients

  1. Elimina cualquier transients en la base de datos de WordPress con el siguiente comando:
    [server]$ wp transient delete --all
  2. Optimiza las tablas restantes en la base de datos con el siguiente comando:
    [server]$ wp db optimize

Si deseas automatizar estos comandos en el futuro, puedes crea un cron job usando el panel de DreamHost.

Si tu tabla de opciones es de 10 MB o más después de la optimización, considera usar el servicio de optimización de base de datos de DreamHost, o comunícate con otro desarrollador profesional de WordPress para obtener más ayuda.

Autoload

Los datos de Autoload es un conjunto de datos que se carga con cada solicitud a la tabla de opciones. Grandes cantidades de datos de autoload pueden causar un rendimiento deficiente de /wp-admin y también pueden afectar al sitio público. Ejecuta el siguiente comando para averiguar cuántos datos de autoload tiene tu sitio:

[server]$ wp db query "SELECT SUM(LENGTH(option_value)/1048576) as 'Autoload(MB)' FROM $(wp config get table_prefix)options WHERE autoload='yes' ;"

Menos de 600 KB es bueno para la mayoría de los servidores, pero los servidores de mayor rendimiento como DreamPress pueden manejar grandes cantidades de datos de autoload.

Si el tamaño de autoload es más grande de lo esperado, corre el siguiente comando:

[server]$ wp db query "SELECT option_name, LENGTH(option_value)/1048576 AS "Size" FROM $(wp config get table_prefix)options WHERE autoload='yes' ORDER BY "Size" DESC LIMIT 25 ;"

Esto devolverá las 25 filas más grandes en una tabla de opciones que se están cargando automáticamente. A partir de aquí, deberás examinar las filas y determinar qué datos se necesitan realmente. Los datos de autoload pueden estar relacionados con tu tema o plugins, y deberás investigar las entradas que no reconoce antes de eliminarlas. Si encuentra filas que se pueden eliminar de forma segura, usa el siguiente comando para hacerlo:

[server]$ wp db query "DELETE FROM $(wp config get table_prefix)options WHERE option_name LIKE '%example_%' ;"
  

Recuerda reemplazar %example_% con el prefijo en la fila que queires eliminar.

Una vez que se elimina una fila, corre wp db optimize nuevamente y prueba tu sitio para asegurarte de que no haya efectos adversos.

Indexar

Indexar ayuda al servidor de la base de datos a encontrar y devolver consultas rápidamente. Puedes verificar si tu tabla de opciones ya tiene un indexx usando el siguiente comando:

[server]$ wp db query "SHOW INDEX FROM $(wp config get table_prefix)options ;"

Generalmente, debes agregar un index cuando tu base de datos tenga entre 60% y 80% de datos no autocargados. Puedes comparar estos valores usando:

[server]$ wp db query "SELECT COUNT(CASE WHEN autoload = 'yes' THEN 1 END) FROM $(wp config get table_prefix)options ;" ; wp db query "SELECT COUNT(CASE WHEN autoload = 'no' THEN 1 END) FROM $(wp config get table_prefix)options ;"

Puedes agregar un index a tu tabla de opciones usando el siguiente comando:

[server]$ wp db query "CREATE INDEX autoload ON $(wp db config get table_prefix)options(autoload, option_name) ;"

Si necesitas eliminar un index, usa el siguiente comando:

[server]$ wp db query "DROP INDEX autoload ON $(wp db config get table_prefix)options ;"

The postmeta table

La tabla postmeta contiene metadatos diversos vinculados a una publicación en tu sitio, como los agregados por plugins y temas, o metadatos para el contenido de la biblioteca de medios. Si tu tabla postmeta es más grande que tu tabla post, es posible que se necesite más optimización. Necesitarás usar dos comandos para buscar en la tabla postmeta, ya que la columna mate_key usa un encabezado _ para configuraciones ocultas y sin guía _ para las configuraciones user-accessible.

Corre los siguientes comandos:

[server]$ wp db query "SELECT SUBSTRING_INDEX(meta_key, '_', 1) AS "Meta",(SUM(LENGTH(meta_id)+LENGTH(post_id)+LENGTH(meta_key)+LENGTH(meta_value)))/1048567 AS "Size", COUNT(*) AS "Count" FROM $(wp config get table_prefix)postmeta WHERE meta_key NOT LIKE '\_%' GROUP BY "Meta" ORDER BY "Size" DESC ;"
[server]$ wp db query "SELECT SUBSTRING_INDEX(meta_key, '_', 2) AS "Meta",(SUM(LENGTH(meta_id)+LENGTH(post_id)+LENGTH(meta_key)+LENGTH(meta_value)))/1048567 AS "Size", COUNT(*) AS "Count" FROM $(wp config get table_prefix)postmeta WHERE meta_key LIKE '\_%' GROUP BY "Meta" ORDER BY "Size" DESC ;"

El primer comando enumerará todas las configuraciones accesibles para el usuario, ordenadas en orden descendente por tamaño de fila. El segundo hace lo mismo, pero para configuraciones ocultas.

Examina los resultados para determinar qué se puede eliminar, si es que hay algo. Los siguientes dos comandos pueden resultar útiles:

[server]$ wp db query "SELECT MAX(t1.post_id) AS "post_id", MAX(t2.post_date) AS "Date", SUBSTRING_INDEX(t1.meta_key, '_', 1) AS "Meta", (SUM(LENGTH(meta_id)+LENGTH(post_id)+LENGTH(meta_key)+LENGTH(meta_value)))/1048567 AS "Size", COUNT(*) AS "Count" FROM $(wp config get table_prefix)postmeta AS t1 JOIN $(wp config get table_prefix)posts AS t2 ON t1.post_id = t2.ID WHERE meta_key NOT LIKE '\_%' GROUP BY "Meta" ORDER BY "Date" DESC ;"
[server]$ wp db query "SELECT MAX(t1.post_id) AS "post_id", MAX(t2.post_date) AS "Date", SUBSTRING_INDEX(t1.meta_key, '_', 2) AS "Meta", (SUM(LENGTH(meta_id)+LENGTH(post_id)+LENGTH(meta_key)+LENGTH(meta_value)))/1048567 AS "Size", COUNT(*) AS "Count" FROM $(wp config get table_prefix)postmeta AS t1 JOIN $(wp config get table_prefix)posts AS t2 ON t1.post_id = t2.ID WHERE meta_key LIKE '\_%' GROUP BY "Meta" ORDER BY "Date" DESC ;"

Estos imprimirán dos tablas (una con un _ inicial y otra sin) que muestran la cadena meta_key, el tamaño que ocupa en la base de datos, la cantidad de filas que la contienen y, lo que es más importante, la fecha y el post_id de la última vez se utilizó. Las entradas de valor de meta_key se pueden usar para identificar filas para plugins o temas que ya no están en uso.

Si se encuentran filas innecesarias, corre el siguiente comando para eliminarlas:

[server]$ wp db query "DELETE FROM $(wp config get table_prefix)options WHERE option_name LIKE '%example_%' ;"

Recuerda reeemplazar %example_% con el prefijo de la fila que deseas eliminar.

Además, puede haber metadatos en tu tabla postmeta que ya no están asociados con una publicación. Corre el siguiente comando para buscar y eliminar metadatos de publicaciones eliminadas:

[server]$ wp db query "SELECT * FROM $(wp config get table_prefix)postmeta pm LEFT JOIN $(wp config get table_prefix)posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL ; DELETE pm FROM $(wp config get table_prefix)postmeta pm LEFT JOIN $(wp config get table_prefix)posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL ;"

La tabla commentmeta

La tabla commentmeta puede saturarse con el tiempo con metadatos para comentarios eliminados, como los eliminados por un plugin de detección de comentarios de spam.

Para enumerar las filas que se eliminan antes de eliminarlas por completo, usa el siguiente comando:

[server]$ wp db query "SELECT * FROM $(wp config get table_prefix)commentmeta WHERE comment_id NOT IN (SELECT comment_id FROM $(wp config get table_prefix)comments) ; DELETE FROM $(wp config get table_prefix)commentmeta WHERE comment_id NOT IN (SELECT comment_id FROM $(wp config get table_prefix)comments) ;"

Revisiones posteriores

Las revisiones de publicaciones de WordPress son versiones históricas o guardadas automáticamente de las publicaciones de tu sitio. WordPress limita el recuento de revisiones a 10 de forma predeterminada, pero pueden hacerlo a medida que aumenta el recuento de publicaciones de tu sitio. Utiliza los siguientes comandos para limpiar las revisiones en la base de datos de tu sitio.

Corre el siguiente comando para obtener un recuento de las revisiones totales en tu sitio:

[server]$ wp post list --post_type='revision' --format=ids | wc -w

Corre el siguiente comando para eliminar cualquier revisión existente:

[server]$ wp post delete $(wp post list --post_type='revision' --format=ids) --force --quiet

Agrega la siguiente directiva a tu archivo wp-config.php para limitar el número máximo de revisiones:

define('WP_POST_REVISIONS', 1);

Asegúrate que cualquier adición a tu wp-config.php se hacen por encima de la línea que dice /* That's all, stop editing! Happy blogging. */.

Ver también

¿Este artículo ha respondido sus preguntas?

Última actualización el PST.

¿Aún no encuentra lo que busca?