Entendiendo la DB de WordPress

Dificultad del post: facilmediadificil
[Total:3    Promedio:5/5]
base de datos wordpress

Vamos a empezar por el principio: voy a intentar hacer un post que es bastante necesario para los usuarios medios/avanzados de WordPress que hacen mantenimientos de sus sitios o de los sitios web WordPress de sus clientes. Hoy vamos a intentar entender la base de datos de WordPress, su estructura, sus tablas y sus puntos débiles.

Como dije en el primer párrafo: empecemos por el principio.

WordPress es un CMS desarrollado en PHP que guarda los datos y ciertas partes de la configuración en una base de datos MySQL o MariaDB. Evidentemente, la base de datos es muy importante, ya que contiene lo más importante de un sitio web: EL CONTENIDO.

wordpress db

  • ¿Dónde se guarda tu contraseña de usuario? En la base de datos.
  • ¿Dónde se guarda la configuración de Yoast SEO? En la base de datos.
  • ¿Dónde se guardan tus posts y páginas? En la base de datos.
  • ¿En WooCommerce, dónde se guardan tus pedidos? En la base de datos.
  • ¿Dónde se guarda…? Bueno, no voy a seguir porque podría estar así todo el día.

En resumen, la DB de WordPress es muy importante y, en muchos casos, es necesario entenderla y saber qué podemos borrar y qué no.
La base de datos de WordPress se va llenando de “mierda” con el tiempo y poco a poco puede complicarnos ciertas labores básicas. Por ejemplo, con las copias de seguridad o con “slow queries” cada vez que algún plugin realiza una consulta un poco compleja a la base de datos.

Vamos a desglosar este artículo en los siguientes puntos o secciones, pero empezaremos por la teoría.

 

Base de datos de WordPress

Como he dicho, vamos a empezar con la teoría.

WordPress, de forma nativa, puede trabajar con bases de datos MySQL y también con MariaDB, ya que es un fork de MySQL y son totalmente compatibles. Además, mediante librerías externas también podemos hacer que WordPress funcione con SQLite, muy útil para casos en los que el hosting no ofrece la posibilidad de tener bases de datos MySQL.

wordpress db

Cuando instalamos WordPress, la instalación base crea las tablas necesarias en la base de datos MySQL o MariaDB. Las tablas que se crean son 12 y son las siguientes:

  • 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.

Las tablas las he puesto con el prefijo por defecto, “wp_”, pero podríamos sustituirlo por otro y, de hecho, es lo recomendable para mejorar la seguridad del CMS.

Este es el esquema generado con MySQL WorkBench de la base de datos por defecto de un WordPress con los distintos tipos de campos de datos:

wordpress db

Adicionalmente, cuando un plugin necesita guardar datos en la base de datos de WordPress (algo muy común) puede hacerlo en las tablas existentes o, por el contrario, crear tablas nuevas en la DB. Esto depende del tipo de datos que vaya a guardar el plugin.

Para que te hagas una idea, cuando instalamos WooCommerce en WordPress se añaden 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

Como ves, se añaden muchas más tablas a la base de datos MySQL de WordPress. Cuando esas tablas se empiezan a llenar y a acumular datos, es cuando la base de datos de WordPress empieza a coger peso.

base de datos wordpress

En el caso de WooCommerce, existe un problema mayor. A pesar de ser la solución para ecommerce más utilizada del mundo, con una cuota de mercado aplastante frente a la competencia, WooCommerce es un plugin para WordPress y depende de la arquitectura de WordPress para muchas cosas, como la base de datos.

En una tienda online WooCommerce todos los productos se meten en la tabla wp_posts y wp_postmeta, exactamente igual que si metemos entradas al blog. Por esta razón, cuando trabajamos con grandes catálogos de productos en WooCommerce podemos tener problemas con las consultas lanzadas a la base de datos para obtener los listados de los productos.

Existen plugins como Premmerce WooCommerce Performance Optimizer que sirven para crear índices de ciertas tablas de la base de datos que suelen almacenar muchos datos, con el fin de que las consultas SQL realizadas a esas tablas sean mucho más rápidas.

 

Optimizar la base de datos de WordPress

¿Y cuál es la razón por la que podemos querer optimizar el tamaño de la base de datos de WordPress? Ya que no podemos modificar la estructura de la base de datos de WordPress, lo que debemos hacer es aligerar la base de datos innecesarios.

base de datos wordpress

¿Cómo podemos optimizar la base de datos MySQL o MariaDB de un WordPress?

Existen varias formas, algunas manuales y otras automáticas. Evidentemente, las manuales requieren conocimientos más o menos avanzados sobre SQL y la estructura propia de la base de datos. Las formas automáticas se realizan mediante plugins para WordPress.

Antes de nada, vamos a aclarar ciertas cosas que nos podemos encontrar en la base de datos de WordPress y que podemos limpiar en algunos casos para conseguir reducir el tamaño:

  • Transients: Los transients son datos que se guardan en la tabla wp_options de WordPress y que funcionan como cache en base de datos para el funcionamiento de algunos plugins y themes. El problema de los transients es que, en instalaciones muy complejas, suelen acumularse muchos y, si no se borran, se quedan almacenados dando problemas con el tamaño y la complejidad.
  • Revisiones y borradores guardados: El editor de WordPress guarda borradores y revisiones de los posts y páginas (y otros custom-posts) abiertos cada cierto tiempo. Por un lado, las revisiones y borradores pueden servirnos de ayuda si tenemos algún problema de pérdida de datos aunque, por otro lado, ocupan espacio en la base de datos de WordPress.
  • Objetos de las papeleras: Normalmente los objetos que están en la papelera son porque no los queremos, así que podemos vaciar por completo las papeleras para liberar espacio en la base de datos de WordPress.
  • Trackbacks y Pingbacks: Los trackbacks y pingbacks pueden ser útiles para mucha gente, pero no para la mayoría. Actualmente, los pingbacks y trackbacks están desuso y casi siempre están desactivados. Sin embargo, en caso de tener alguno antiguo en nuestro WordPress podemos borrarlo de las tablas de la base de datos.
  • Metadatos huérfanos: Para la tabla wp_users, para la tabla wp_comments y para la tabla wp_posts existen tablas META que guardan metadatos del contenido de las tablas anteriormente mencionadas. En algunos casos, pueden quedarse metadatos huérfanos que debemos limpiar para evitar que ocupen espacio innecesario en la base de datos.

Vamos a mostrar métodos automáticos para optimizar la DB de WordPress, es decir, mediante plugins para WordPress. Finalmente, hablaremos de los métodos manuales para limpiar algunos elementos de la base de datos MySQL / MariaDB de WordPress.

 

Plugin WP Optimize para WordPress

El plugin WP Optimize para WordPress es uno de los plugins más conocidos para limpiar y optimizar la base de datos de WordPress.

Se trata de un plugin gratuito y que, actualmente, tiene algunas funcionalidades añadidas relacionadas con el WPO general de WordPress.

base de datos wordpress

Aunque también nos hará un listado completo de las tablas de la base de datos de WordPress, detectando las tablas huérfanas (de plugins desactivados) y permitiéndonos borrarlas para ahorrar espacio en la base de datos:

base de datos wordpress

Como he dicho, es un plugin de los más conocidos y de los más utilizados. Aunque reconozco que su limpiador no es el más potente, su funcionalidad para detectar tablas huérfanas es de las más útiles y potentes, ya que normalmente las tablas huérfanas con el paso del tiempo suelen traer bastantes problemas.

Si quieres más información acerca del plugin WP Optimize para WordPress, puedes hacer clic aquí: https://es.wordpress.org/plugins/wp-optimize/

 

Plugin Advanced Database Cleaner para WordPress

Se trata de un plugin con una muy buena interfaz y por eso quiero mencionarlo, aunque la versión gratuita se encuentra bastante limitada en todos los sentidos.

La versión gratuita de Advanced Database Cleaner para WordPress nos permitirá limpiar el contenido basura de las tablas de la base de datos, pero no nos dejará detectar tablas huérfanas o detectar distintos tipos de contenidos dentro de la tabla wp_options con el fin de optimizarla.

Como puedes ver en la siguiente imagen, su configuración se encuentra organizada en pestañas y listados:

base de datos wordpress

En la versión profesional de pago podremos gestionar las tareas programadas de la instalación de WordPress (algo que yo hago con Advanced Cron Manager en WordPress). También podremos gestionar la tabla wp_options y lo que se guarda en ella, además de detectar y permitirnos gestionar tablas y opciones huérfanas.

Simplemente añadir que, si quieres más información acerca de la versión gratuita, puedes encontrar su ficha en el repositorio de plugins de WordPress: https://es.wordpress.org/plugins/advanced-database-cleaner/

Si quieres más información acerca de la versión de pago, puedes encontrarla aquí: https://sigmaplugin.com/downloads/wordpress-advanced-database-cleaner

 

Plugin WP Rocket para WordPress

Finalmente, como siempre, vuelvo a hablar de WP Rocket para WordPress. Aunque es un plugin de cache, también tiene un módulo de optimización de la base de datos de WordPress que podemos aprovechar, pese a que es mucho más simple que cualquiera de las dos opciones que hemos comentado anteriormente.

base de datos wordpress

Como he dicho, se trata de un optimizador bastante básico. Tanto es así que yo, en mis clases de WPO, me lo suelo saltar ya que no lo tengo ni como opción.

Pero si usas WP Rocket y tienes pánico a instalar muchos plugins en tu WordPress, su limpiador de bases de datos puede ayudarte.

Si quieres más información acerca de WP Rocket para WordPress: https://alvarofontela.com/wprocket

También quiero mencionar, antes de acabar, que la herramienta de limpieza y optimización de base de datos de uno de los competidores de WP Rocket, Swift Performance, es algo más completa.

 

Plugin WP-DBManager para WordPress

WP-DBManager es un plugin gratuito muy simple que nos permitirá realizar algunas acciones interesantes en la base de datos de WordPress.

Ofrece bastante información sobre la base de datos y las tablas:

base de datos wordpress

Nos permite optimizar y reparar la base de datos MySQL o MariaDB, así como eliminar tablas que nosotros queramos, como las que guardan logs o registros que no son necesarios para el funcionamiento normal de WordPress:

base de datos wordpress

Evidentemente, todo esto también lo podemos realizar de igual forma con phpMyAdmin, pero resulta bastante útil poder hacerlo directamente con un plugin para WordPress.

Si quieres más información acerca de WP-DBManager, puedes encontrarla en la ficha del plugin en el repositorio de plugins de WordPress: https://es.wordpress.org/plugins/wp-dbmanager/

 

Optimización manual mediante consultas SQL

Todos los plugins anteriormente mencionados funcionan de una forma relativamente fácil, ya que simplemente ejecutan sentencias SQL en la base de datos.

Para ejecutar consultas SQL podemos hacerlo de distintas formas. Por un lado, podemos utilizar la herramienta PHPMyAdmin que tienen el 99,9% de los hosting:

optimizar base de datos de wordpress

La pestaña “SQL” que puedes ver en la imagen anterior es la que nos permitirá ejecutar sentencias SQL directamente en el servidor MySQL / MariaDB.

Empezamos con la eliminación de revisiones del editor de WordPress, con esta sentencia SQL las borraremos todas de la base de datos de WordPress:

Las revisiones normalmente, si no las utilizamos, sobran todas y solo ocupan espacio.

Con esta otra sentencia eliminarás todos los comentarios marcados como SPAM que hay en la base de datos de WordPress:

Y con esta otra sentencia SQL puedes borrar todos los comentarios que no han sido aprobados:

Con esta otra sentencia podemos limpiar los tags que no tienen ningún post asociado, lo cual es muy útil cuando hay una cantidad brutal de etiquetas / tags y no podemos seleccionarlas de forma manual:

Con esta otra sentencia SQL eliminarás todos los pingbacks y trackbacks que tenga la base de datos de WordPress. Muy útil si ya los tienes previamente desactivados:

Con este código eliminarás TODOS los transients que existan dentro de la base de datos de WordPress, en la tabla wp_options:

Es recomendable borrar los transients cada cierto tiempo para evitar que se sobrecargue la base de datos con contenido temporal.

Finalmente, también podemos optimizar la base de datos de WordPress con la función de optimización de phpMyAdmin:

optimizar base de datos de wordpress

Para ello, como puedes ver en la imagen anterior, seleccionamos todas las tablas de la DB de WordPress y seleccionamos la opción de optimizar en el desplegable.

 

Crear índices en la base de datos de WordPress

Una forma de optimizar la velocidad de carga al hacer consultas a la base de datos de WordPress es utilizando índices.

Realmente, un “índice” es lo que indica la palabra. Funciona como el índice de un libro y nos permiten encontrar contenido de forma más rápida dentro de una base de datos. Por eso, reduce los tiempos de respuesta de las consultas y también el consumo de recursos.

En instalaciones WordPress muy grandes se suelen utilizar índices en la tabla wp_options.

optimizar base de datos de wordpress

Podemos hacer esto de forma manual o utilizando plugins que nos mantendrán actualizado el índice sin que nosotros tengamos que mantenerlo.

Existen distintos plugins gratuitos para mantener un índice de todas las opciones que tengan el parámetro “autoload” en la tabla wp_options. Las opciones con el parámetro “autoload” son cargadas por la función wp_load_alloptions() y que se cargan en TODO el sitio web de forma global, aunque en algunas partes no son necesarias.

El problema es que, cuantos más registros tenga la tabla wp_options de WordPress, más registros tendrán el campo “autoload” en activado. Como resultado, tendremos problemas de slow queries en las cargas.

El plugin Add Index To Autoload te permitirá mantener un índice de las tablas con autoload de wp_options: https://wordpress.org/plugins/add-index-to-autoload/

Si quieres implementar de forma manual un índice para la tabla wp_options y los parámetros con autoload, puedes seguir el siguiente manual: https://guides.wp-bullet.com/add-mysql-index-wordpress-wp_options-table/

 

Optimizar la base de datos de WooCommerce

Cuando trabajamos con WordPress + WooCommerce, uno de los problemas que nos encontramos al trabajar con grandes catálogos es que tenemos problemas con las consultas grandes a la base de datos.

Como he dicho antes, el problema en gran parte viene por la arquitectura que tiene una tienda online creada con WooCommerce, donde los productos se guardan en la tabla donde se guardarían los posts en WordPress.

Existen plugins que nos permiten crear índices de la DB para la tabla wp_options y el parámetro autoload, pero también existe un plugin que nos permite crear índices de las tablas de contenido con el fin de acelerar un poco las consultas cuando tenemos en un WooCommerce un catalogo muy grande de productos.

optimizar base de datos de wordpress

El plugin Premmerce WooCommerce Performance Optimizer es un complemento que teóricamente, entre otras cosas, ajusta ciertas cosas en la forma en la que se cargan los productos desde la DB en WooCommerce con el fin de acelerar la carga.

La teoría dice que se consiguen mejores resultados, aunque tampoco puedo garantizar una mejoría ya que no lo he probado con webs lo suficientemente grandes. Estos son los tests que hizo su desarrollador y que nos ofrece en su blog oficial: https://premmerce.com/testing-online-store-500k-products-powered-woocommerce/

Puedes encontrar más información sobre Premmerce WooCommerce Performance Optimizer y su utilización en el post que he publicado sobre cómo optimizar WooCommerce y su WPO: https://alvarofontela.com/wpo-optimizar-woocommerce-tienda-online/

 

Reparar la base de datos de WordPress

Existen distintos métodos para reparar una base de datos de WordPress con daños o inconsistencia de datos.

¿Cómo puede dañarse una base de datos MySQL o MariaDB de WordPress? Pues fácil, una de las razones suele ser las constantes caídas del servidor MySQL / MariaDB hasta que algo se dañe.

Con phpMyAdmin podemos reparar la base de datos de WordPress:

optimizar base de datos de wordpress

Pero WordPress también trae un mecanismo de reparación de la base de datos que podemos activar desde el wp-config.php con el siguiente parámetro:

Si no sabes editar el wp-config.php de tu WordPress, puedes ver el siguiente vídeotutorial:

Después de añadir el parámetro al wp-config.php, nos vamos al navegador e introducimos la URL de tu sitio web como en este ejemplo:

Lo que obtendremos es un asistente que nos permitirá reparar o reparar y optimizar la base de datos MySQL.

optimizar base de datos de wordpress

Y esto es un ejemplo de caso en el que algunas tablas se reparan y otras no pueden repararse por distintas razones:

optimizar base de datos de wordpress

Cualquiera de estos dos métodos para reparar la DB de WordPress no son infalibles y, en muchos casos, es necesario jugar con las copias de seguridad existentes y reimplantar ciertas tablas para conseguir devolver la integridad a la base de datos y la consistencia a los datos.

 

Optimizar un servidor MySQL o MariaDB

Para finalizar, vamos a hablar de las optimizaciones que podemos hacer de un servidor de base de datos MySQL o MariaDB.

Existen unos cuantos parámetros que podemos tocar, sobre todo para adaptar el funcionamiento del servidor a las necesidades de la aplicación o aplicaciones que se ejecutan.

Cuando me toca optimizar servidores con webs muy pesadas y exigentes, normalmente utilizo el script MySQL Tuner, desarrollado en Perl.

optimizar base de datos de wordpress

Con el script MySQL Tuner analizo el rendimiento y la utilización del servicio MySQL o MariaDB durante las últimas 24 horas con un funcionamiento normal. Posteriormente, lo ejecuto para ver qué cambios tengo que hacer en los parámetros del archivo de configuración my.conf.

Si quieres más información acerca del script MySQL Tuner, puedes encontrarla aquí: https://github.com/major/MySQLTuner-perl

Como digo siempre en mis ponencias y en mis clases de WPO, para mí el primer paso para optimizar las consultas y el funcionamiento general de la base de datos es optimizar el funcionamiento del servidor MySQL o MariaDB mediante la configuración y correcta parametrización de los archivos de configuración.

En el caso de un servidor de hosting compartido especializado en WordPress, como los servidores de Raiola Networks, los parámetros de configuración de MariaDB están correctamente configurados para funcionar con la mayoría de CMS, especialmente el query_cache y los diferentes caches que se pueden configurar en el motor de base de datos.

 

Share on twitter
Twitter
Share on facebook
Facebook
Share on linkedin
LinkedIn
Álvaro Fontela
Álvaro Fontela
Soy ponente en eventos de marketing digital, consultor WordPress y co-fundador de Raiola Networks, amante del mundo del motor (coches japoneses) y tecnófilo empedernido.

6 comentarios en “Entendiendo la DB de WordPress”

  1. Muy interesante artículo. Soy usuario entre novato e intermedio de WordPress, con un sitio web en desarrollo y los datos que aportas en el artículo me han resultado útiles. Muchas gracias.

    Responder
  2. Hola Alvaro… Como normalmente te sigo y creo que eres un crack jajaja. Y aunque no viene a cuento con este artículo, el Wp Rocket esta haciendo mal las redicciones de URL al «/» …. Aunque el canonical está en la URLs, por ejemplo, puedes ver que tienes https://alvarofontela.com/entendiendo-base-datos-mysql-wordpress sin «/» y se carga el artículo, y el https://alvarofontela.com/entendiendo-base-datos-mysql-wordpress/ por separado y se carga….

    Los bichos de Wp Rocket no han dicho nada, pero desde https://docs.wp-rocket.me/article/131-redirection-to-enforce-trailing-slash-on-urls que fue publicado el 10 de Octubre de este año. (POR CIERTO, SI UTILIZÁIS EL PLUGIN, entre jpg|png|jpeg|css|xml|txt|js|….añadir también la extensión |ico| que parece mentira que hagan estos errores los de Wp Rocket en no tener en cuenta el Favicon).

    Es para que tengas conocimiento, aquí cada cual que adopte la opción oportuna. Un saludo y gracias por el buen contenido de la web, Pau

    Responder
    • Muchas gracias por avisar Pau, voy a revisar, pero en mi caso el problema viene por otro lado, por Nginx, ya que hace una semana y poco hice un cambio de servidor y creo que me olvide de ajustar el tema de los slash en Nginx para que redireccion de sin slash a con slash siempre.

      Un saludo y muchas gracias.

      Responder
  3. Hola. Consulta. Al instalar wordpress localhost, no me aparece el cartel de finalizada la instalación…sino uno de conexion critica. Las 12 tablas se generan en la base de datos, pero la wp_users está vacia. Le inserto un usuario y clave en en wp_users para poder acceder luego por localhost/ , logro entrar pero no me aparece el dashboard…solo aparece mi pagina en blanco. Probe en 2 portatiles y me pasa lo mismo. Podrás guiarme ?

    Responder
    • Hola Pablo, es un caso bastante raro, pero sin saber mas datos no puedo ayudarte.

      Si puedes, envíame a través del formulario de contacto el error exacto y el stack que estas usando, ya que no es el típico error que suelen dar las instalaciones de WordPress, tiene que ser algo del stack por instalarlo en local…

      Responder

Deja un comentario

Share on twitter
Share on facebook
Share on linkedin
¿Quieres recibir mi contenido semanal?
¡Te enviare todas las semanas mi contenido!
Cabecera del formulario de suscripción
  • RESPONSABLE:

    RAIOLA NETWORKS, S.L.

    C.I.F.: B27453489

    Avda de Magoi, 66, Semisótano, Dcha., 27002 Lugo (Lugo)

    Telefono: +34 982776081

    e-mail: info@raiolanetworks.es

    FINALIDAD:Atender solicitudes de información, ejecución de la contratación de servicios y remisión de comunicaciones comerciales.
    LEGITIMACIÓN:Consentimiento del interesado y contratación de productos y/o servicios del Responsable
    DESTINATARIOS:

    No se ceden datos a terceros, salvo obligación legal.

    Personas físicas o jurídicas directamente relacionadas con el Responsable

    Encargados de Tratamiento adheridos al Privacy Shield

    DERECHOS:Acceder, rectificar y suprimir los datos, portabilidad de los datos, limitación u oposición a su tratamiento, derecho a no ser objeto de decisiones automatizadas, así como a obtener información clara y transparente sobre el tratamiento de sus datos.
    INFORMACIÓN ADICIONAL:Se puede consultar la política de privacidad de forma más detallada aquí.
  • Este campo es un campo de validación y debe quedar sin cambios.