Empecemos por el principio: voy a intentar crear una guía que es bastante importante para los usuarios medios o avanzados de WordPress que mantienen sus sitios web o los sitios web de sus clientes. Hoy intentaremos comprender la base de datos de WordPress, su estructura, sus tableros y sus puntos débiles.
Como mencioné en el primer párrafo, debemos comenzar por el principio.
WordPress es un sistema de gestión de contenidos (CMS) basado en PHP que almacena los datos y algunas configuraciones en una base de datos MySQL o MariaDB. Es evidente que la base de datos es de gran importancia porque contiene el contenido, que es lo más importante de un sitio web.
- ¿Dónde está la contraseña de usuario guardada? dentro de la base de datos.
- ¿En qué lugar se guarda la configuración de SEO de Yoast? dentro de la base de datos.
- ¿En qué lugar se guardan tus publicaciones y páginas? dentro de la base de datos.
- ¿En qué área de WooCommerce se guardan tus pedidos? dentro de la base de datos.
- ¿En qué lugar se almacena…? No seguiré porque podría ser así todo el día.
En resumen, la base de datos de WordPress es crucial y, en muchos casos, es necesario comprenderla y saber qué podemos y qué no borrar.
Con el tiempo, la base de datos de WordPress se llena de «basura», lo que puede complicarnos ciertas tareas básicas. Por ejemplo, con copias de seguridad o «quejas lentas» cada vez que un complemento realiza una consulta un poco complicada a la base de datos.
Base de datos de WordPress
Como ya mencioné, comenzamos con la teoría.
Como fork de MySQL, WordPress puede trabajar de forma nativa con bases de datos MySQL y MariaDB. Además, podemos hacer que WordPress funcione con SQLite utilizando librerías externas, lo que es muy útil para casos en los que el host no ofrece la posibilidad de tener bases de datos MySQL.
La instalación base crea las tablas en la base de datos MySQL o MariaDB cuando instalamos WordPress. Las siguientes son las doce tablas creadas:
- wp_commentmeta: Contiene metadatos de los comentarios del blog, guardados en la tabla wp_comments.
- wp_comments: Contiene los comentarios, es decir, el contenido de los comentarios del blog.
- wp_links: Aquí se guardan los enlaces si la funcionalidad está activada. Antiguamente siempre venía activada al instalar WordPress.
- wp_options: Es una de las tablas más importantes de WordPress, ya que guarda toda la configuración e incluso algunos plugins pueden guardar datos de contenido ahí. En el 99% de los casos, las slow queries ocurren en consultas realizadas a esta tabla en instalaciones muy “saturadas”.
- wp_postmeta: Contiene metadatos relacionados con los posts de la tabla wp_posts. En algunas ocasiones, cuando usamos themes o plantillas muy “completas”, se puede llenar muy rápido con datos irrelevantes y causar slow queries también.
- wp_posts: Almacena el contenido de los posts, páginas y cualquier custom-post que se registre en la instalación de WordPress. Por ejemplo, los productos de un WooCommerce.
- wp_termmeta: Contiene los metadatos de las categorías y etiquetas. En algunos casos, esta tabla también ha sido protagonista de problemas y errores que provocaban altos consumos de recursos de CPU.
- wp_terms: Contiene las categorías y las etiquetas de la instalación WordPress.
- wp_term_relationships: Almacena la asociación entre los posts y las categorías y etiquetas con las que están relacionados.
- wp_term_taxonomy: Aquí se guardan las descripciones de las etiquetas y categorías, es decir, es una tabla relacionada con wp_terms.
- wp_usermeta: Contiene metadatos de los usuarios registrados en la instalación de WordPress y que podemos encontrar en wp_users.
- wp_users: Contiene los datos de los usuarios que tenemos en WordPress.
He utilizado el prefijo «wp_» por defecto en las tablas, pero podríamos usar otro y, de hecho, esto es lo que se recomienda para mejorar la seguridad del CMS.
Este esquema fue creado utilizando MySQL WorkBench de la base de datos por defecto de un WordPress con varios tipos de campos de datos:
Adicionalmente, si un plugin necesita almacenar datos en la base de datos de WordPress, lo cual es bastante común, puede hacerlo en las tablas existentes o, por el contrario, crear tablas nuevas en la base de datos. Esto varía según el tipo de datos que guarda el plugin.
Como ejemplo, cuando instalamos WooCommerce en WordPress, se agregan las siguientes tablas:
- wp_wc_download_log
- wp_wc_product_meta_lookup
- wp_wc_tax_rate_classes
- wp_wc_webhooks
- wp_woocommerce_api_keys
- wp_woocommerce_attribute_taxonomies
- wp_woocommerce_downloadable_products_permissions
- wp_woocommerce_log
- wp_woocommerce_order_itemmeta
- wp_woocommerce_order_items
- wp_woocommerce_payment_tokementa
- wp_woocommerce_paypal_tokens
- wp_woocommerce_sessions
- wp_woocommerce_shipping_zones
- wp_woocommerce_shipping_zone_locations
- wp_woocommerce_shipping_zone_methods
- wp_woocommerce_tax_rates
- wp_woocommerce_tax_rate_locations
Se han agregado muchas más tablas a la base de datos MySQL de WordPress, como puedes ver. La base de datos de WordPress empieza a crecer a medida que esas tablas se llenan y se acumulan datos.
Existe un mayor problema con WooCommerce. WooCommerce es un plugin para WordPress y depende de la arquitectura de WordPress para muchas cosas, como la base de datos, a pesar de ser la solución para e-commerce más utilizada del mundo, con una cuota de mercado aplastante frente a la competencia.
En una tienda online WooCommerce, todos los productos se almacenan en la tabla wp_posts y wp_postmeta, de manera similar a cómo se almacenan entradas en un blog. Por esta razón, podemos tener problemas con las consultas enviadas a la base de datos para obtener los listados de productos cuando trabajamos con grandes catálogos de productos en WooCommerce.
Plugins como Premmerce WooCommerce Performance Optimizer pueden crear índices para algunas tablas de la base de datos que normalmente almacenan muchos datos, lo que hace que las consultas SQL realizadas an esas tablas sean mucho más rápidas.
Optimización de la base de datos de WordPress
¿Y por qué podemos querer reducir el tamaño de la base de datos de WordPress? Debido a que no podemos alterar la estructura de la base de datos de WordPress, debemos reducir la base de datos innecesaria.
¿Cómo podemos hacer que la base de datos MySQL o MariaDB de un WordPress sea más eficiente?
Existe una variedad de opciones, algunas de las cuales son manuales y otras automáticas. Es obvio que los manuales requieren una comprensión más o menos avanzada de SQL y la estructura de la base de datos. Los plugins de WordPress realizan las formas automáticas.
Antes de nada, aclararemos algunas cosas que podemos encontrar en la base de datos de WordPress y que podemos limpiar para reducir su tamaño:
- Los transients son datos que se guardan en la tabla wp_options de WordPress y se utilizan como cache en la base de datos para que algunos plugins y temas funcionen correctamente. El problema con los transients es que suelen acumularse muchos en instalaciones muy complejas y, si no se eliminan, se quedan almacenados, lo que causa problemas de tamaño y complejidad.
- Revisiones y borradores guardados: Cada cierto tiempo, el editor de WordPress guarda los borradores y revisiones de los posts y páginas (y otros posts personalizados) abiertos. Por un lado, las revisiones y los borradores pueden ser útiles si tenemos problemas con la pérdida de datos, pero ocupan espacio en la base de datos de WordPress.
- Objetos de la papelera: Por lo general, los objetos en la papelera están porque no los queremos, lo que nos permite liberar espacio en la base de datos de WordPress.
- Trackbacks y Pingbacks: Muchas personas pueden beneficiarse de ellos, pero la mayoría no. Los pingbacks y trackbacks actualmente están desuso y casi siempre están desactivados. Sin embargo, si tenemos alguna versión antigua de WordPress, podemos borrarla de las tablas de la base de datos.
- Los metadatos huérfanos se guardan en las tablas META de las tablas wp_users, wp_comments y wp_posts. En algunos casos, pueden quedar metadatos huérfanos que debemos limpiar para evitar que la base de datos ocupe espacio innecesario.
Vamos a mostrar métodos automáticos para optimizar la base de datos de WordPress, es decir, usando plugins de WordPress. Finalmente, hablaremos sobre los métodos manuales para limpiar algunos elementos de la base de datos MySQL/MariaDB de WordPress.
WP Optimize para WordPress
Uno de los plugins de WordPress más conocidos para limpiar y optimizar la base de datos es WP Optimize.
Se trata de un plugin gratuito que actualmente incorpora algunas funciones relacionadas con la política general de plugins de WordPress.
Aunque también nos proporcionará una lista completa de las tablas de la base de datos de WordPress, identificando las tablas que no están disponibles (debido a los plugins que se han desactivado) y permitiéndonos borrarlas para reducir el tamaño de la base de datos:
Como ya mencioné, es un plugin muy conocido y popular. Aunque reconozco que su limpiador no es el más potente, su capacidad para detectar tablas huérfanas es de las más útiles y potentes porque las tablas huérfanas suelen causar muchos problemas con el tiempo.
El plugin WP Rocket para WordPress
Por último, pero no menos importante, como siempre, vuelvo a hablar de WP Rocket para WordPress. A pesar de ser un plugin de cache, también incluye un módulo de optimización de la base de datos de WordPress que podemos utilizar, aunque es mucho más sencillo que la opción anterior.
Plugin WP-DBManager para WordPress
WP-DBManager es un plugin gratuito muy sencillo que nos permitirá realizar varias tareas interesantes en la base de datos de WordPress.
No solo nos permite optimizar y reparar la base de datos MySQL o MariaDB, sino que también nos permite eliminar tablas que queramos, como las que guardan registros o logs que no son necesarios para el funcionamiento normal de WordPress.
Es cierto que podemos realizar todo esto de manera similar con phpMyAdmin, pero es muy beneficioso hacerlo directamente con un plugin para WordPress.
Optimización automatizada utilizando consultas SQL
Optimizar manualmente la base de datos de WordPress
Podemos usar una variedad de métodos para ejecutar consultas SQL. Por un lado, podemos usar la herramienta PHPMyAdmin, que tiene el 99,9% de los servidores de hosting:
La imagen anterior muestra la pestaña «SQL», que nos permite ejecutar sentencias SQL directamente en el servidor MySQL/MariaDB.
Empezaremos eliminando las revisiones del editor de WordPress utilizando esta sentencia SQL para borrarlas de la base de datos de WordPress:
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON ( a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON ( a.ID = c.post_id )
LEFT JOIN wp_term_taxonomy d ON ( b.term_taxonomy_id = d.term_taxonomy_id)
WHERE a.post_type = 'revision'
AND d.taxonomy != 'link_category';
Si no las usamos, las reseñas generalmente sobran y solo ocupan espacio.
Esta sentencia adicional eliminará todos los comentarios marcados como spam de la base de datos de WordPress:
DELETE FROM wp_comments WHERE comment_approved = 'spam';
Y puedes borrar todos los comentarios que no han sido aprobados con esta otra sentencia SQL:
DELETE from wp_comments WHERE comment_approved = '0';
Cuando hay una gran cantidad de etiquetas/etiquetas y no podemos seleccionarlas manualmente, esta otra sentencia es muy útil para limpiar las etiquetas que no tienen ningún post asociado:
DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE count = 0 );
DELETE FROM wp_term_taxonomy WHERE term_id not IN (SELECT term_id FROM wp_terms); DELETE FROM wp_term_relationships WHERE term_taxonomy_id not IN (SELECT term_taxonomy_id FROM wp_term_taxonomy);
Esta otra sentencia SQL eliminará todos los comentarios y comentarios de la base de datos de WordPress. Muy útil si ya los has desactivado:
DELETE FROM wp_comments WHERE comment_type = 'pingback';
DELETE FROM wp_comments WHERE comment_type = 'trackback';
Este código eliminará todos los transients en la tabla wp_options de la base de datos de WordPress:
DELETE FROM wp_options WHERE option_name LIKE ('%\_transient\_%')
Para evitar sobrecargar la base de datos con contenido temporal, es recomendable borrar los transientes con frecuencia.
Por último, pero no menos importante, podemos utilizar la función de optimización de phpMyAdmin para mejorar la base de datos de WordPress:
Como se muestra en la imagen anterior, elegimos todas las tablas de la base de datos de WordPress y elegimos la opción de optimizar en el desplegable.
Optimizar la base de datos de WooCommerce
Cuando trabajamos con WordPress + WooCommerce, uno de los problemas que tenemos al trabajar con catálogos de gran tamaño es que tenemos problemas con las consultas de base de datos de gran tamaño.
Como mencioné anteriormente, la estructura de una tienda online creada con WooCommerce, en la que los productos se guardan en una tabla donde se guardarían los posts de WordPress, es la principal fuente del problema.
Existen plugins que nos permiten crear índices de DB para la tabla wp_options y el parámetro autoload, pero también hay un plugin que nos permite crear índices de tablas de contenido, lo que acelera un poco las consultas cuando tenemos un gran catalogo de productos en WooCommerce.
El plugin Premmerce WooCommerce Performance Optimizer es un complemento que teóricamente cambia ciertas cosas en la forma en que se cargan los productos desde la base de datos de WooCommerce para acelerar la carga.
La teoría dice que se obtienen mejores resultados, pero no puedo garantizar una mejoría porque no lo he probado con webs lo suficientemente grandes. Su desarrollador realizó estas pruebas y las comparte con nosotros en su blog oficial.
Reparar la base de datos de WordPress
Existe una variedad de técnicas disponibles para reparar una base de datos de WordPress que sufre daños o inconsistencias de datos.
¿De qué manera se puede dañar una base de datos MySQL o MariaDB de WordPress? Una de las razones más comunes es que las constantes del servidor MySQL/MariaDB caen hasta que se daña algo.
Podemos reparar la base de datos de WordPress utilizando phpMyAdmin:
Sin embargo, WordPress también incluye un mecanismo de reparación de la base de datos que podemos activar ingresando el parámetro siguiente en wp-config.php:
define('WP_ALLOW_REPAIR', true);
Después de agregar el parámetro al wp-config.php, ingresamos la URL de tu sitio web en el navegador.
Un asistente que recibiremos nos permitirá reparar o reparar y optimizar la base de datos MySQL.
Conclusiones
En esta guía conocimos cómo funciona y se estructura la base de datos nativa de WordPress. Conocer la base de datos de WordPress nos permitirá tener un mayor control de lo que está ocurriendo en nuestro sitio web. Pero más importante, nos ayudará a optimizar la velocidad de nuestro sitio.
Para optimizar nuestra base de datos, tenemos dos opciones. Por un lado, revisamos los mejores plugins de optimización de base de datos. Además, proporcionamos algunas sentencias o códigos para hacerlo de forma manual mediante el apartado de consultas SQL en nuestra sección de phpMyAdmin dentro de nuestro panel de hosting.