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 imágenes, plugins y archivos de temas, y los archivos principales de WordPress. La base de datos contiene 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 describe varios métodos para optimizar la base de datos de un sitio de WordPress.
Este artículo usa wp-cli para optimizar la base de datos. Debes 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 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
Para eliminar y optimizar:
- Elimina cualquier transients en la base de datos de WordPress con el siguiente comando:
[server]$ wp transient delete --all
- 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.
Cargar automáticamente / 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' or autoload='on' ;"
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' or autoload='on' ORDER BY "Size" DESC LIMIT 25 ;"
Este comando devuelve 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_%' ;"
Reemplaza example_ con el prefijo en la fila que quieres eliminar. Además, asegúrate de mantener los símbolos % al principio y al final, ya que actúan como consultas wildcard.
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 index 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 cargados automáticamente. 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 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 config get table_prefix)options ;"
La tabla postmeta
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 muestra 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 comandos imprimen 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_postmeta WHERE meta_key LIKE '%example_%' ;"
Reemplazar %example_% con el prefijo de la fila que deseas eliminar. Además, asegúrate de mantener los símbolos % al principio y al final, ya que actúan como consultas wildcard.
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 por defecto, pero pueden expanderlo 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. */.