Tutoriales 11 min de lectura

Cómo optimizar la base de datos de WooCommerce en alto volumen

Qué vas a lograr

Un WooCommerce que procesa pedidos rápidamente incluso con catálogo de 10,000+ productos y 100,000+ pedidos históricos. Las páginas de producto, checkout y admin de pedidos cargan en menos de 2 segundos. Los cron jobs no saturan el servidor durante picos de tráfico.

Requisitos previos

  • WooCommerce 7.0+
  • Acceso SSH al servidor o cPanel con phpMyAdmin
  • Plugin WP-Optimize o Advanced Database Cleaner para limpieza
  • Redis o Memcached disponible en el servidor (la mayoría de hosting managed lo incluye)
  • Acceso al archivo my.cnf o my.ini para configuración de MySQL

Paso 1 — Diagnosticar y limpiar tablas infladas

  1. Instala plugin Query Monitor para identificar queries lentas en tiempo real en el frontend y admin
  2. En phpMyAdmin, verifica el tamaño de tablas clave: wp_posts (pedidos), wp_postmeta, wp_options, wp_woocommerce_sessions
  3. Limpiar wp_options (transients): ejecutar en MySQL: DELETE FROM wp_options WHERE option_name LIKE '%_transient_%'
  4. Limpiar wp_woocommerce_sessions: DELETE FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP()
  5. Limpiar pedidos con estado basura via WP-Optimize: Dashboard → WP-Optimize → Database → Clean up WooCommerce (pending orders > 30 días, failed orders, etc.)
  6. Usa WP-CLI para limpiar automáticamente: wp transient delete --all

Paso 2 — Agregar índices a tablas críticas

  1. Las tablas sin índices adecuados hacen full table scans en cada query. En phpMyAdmin ejecuta:
-- Índice para pedidos por cliente (muy común en admin de WooCommerce)
ALTER TABLE wp_postmeta ADD INDEX (meta_key, meta_value(20));

-- Índice para sessions
ALTER TABLE wp_woocommerce_sessions ADD INDEX (session_expiry);

-- Índice para orders
ALTER TABLE wp_posts ADD INDEX (post_type, post_status, post_date);
  1. Verifica en Query Monitor que las queries más lentas mejoran su tiempo de ejecución

Paso 3 — Implementar Redis Object Cache

  1. Instala plugin Redis Object Cache
  2. En wp-config.php agrega: define WP_CACHE como true, WP_REDIS_HOST como 127.0.0.1, WP_REDIS_PORT como 6379
  3. En el plugin: Settings → Enable Object Cache
  4. Redis cachea los resultados de queries MySQL frecuentes. Las queries subsecuentes se sirven desde memoria RAM en lugar de MySQL
  5. Verifica: wp redis status via WP-CLI debe mostrar Status: Connected, Hit Ratio: 80%+ (objetivo después de 1 hora de tráfico)

Paso 4 — Configurar MySQL para WooCommerce

En my.cnf (Linux) o my.ini (Windows), ajusta estas configuraciones para un servidor de 4 GB RAM:

[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
query_cache_size = 0
max_connections = 150
tmp_table_size = 64M
max_heap_table_size = 64M

Verificación y troubleshooting

  • Queries lentas persistentes: en MySQL activa slow query log (slow_query_log = 1, long_query_time = 1) para identificar las queries que superan 1 segundo
  • Redis no reduce queries MySQL: verifica que el Object Cache está activo en todas las páginas, no solo en frontend. Query Monitor muestra si el caché tiene hit o miss
  • Disk I/O alto después de limpieza: ejecuta OPTIMIZE TABLE wp_posts y OPTIMIZE TABLE wp_postmeta en MySQL para desfragmentar las tablas después de eliminar datos masivos

Próximos pasos y optimización

  • WooCommerce HPOS: activa High Performance Order Storage en WooCommerce → Settings → Advanced → Features. Migra pedidos a tablas optimizadas en lugar de wp_posts
  • Archivado de pedidos: mueve pedidos completados de más de 1 año a tabla de archivo. Reduce el tamaño de wp_posts significativamente
  • Database monitoring: configura New Relic o Query Monitor en staging para detectar nuevas queries lentas antes de que lleguen a producción

En Weblindrome ofrecemos Comercio electrónico para ayudarte con esta y otras implementaciones. Solicita una cotización personalizada.

Preguntas frecuentes

¿Cuándo es necesario optimizar la base de datos de WooCommerce?

Señales de que necesitas optimizar: el admin de pedidos tarda más de 5 segundos en cargar, el checkout tarda más de 3 segundos, tienes más de 50,000 pedidos históricos en wp_posts, el tamaño de wp_postmeta supera 500 MB, o experimentas caídas del servidor durante picos de tráfico. No esperes a tener problemas: una optimización preventiva con 10,000+ pedidos es mucho más sencilla que una emergencia con 200,000+.

¿Qué es WooCommerce HPOS y por qué importa?

High Performance Order Storage (HPOS) es la nueva arquitectura de pedidos de WooCommerce que almacena pedidos en tablas propias (wp_wc_orders, wp_wc_order_items) en lugar de la tabla genérica wp_posts. Esto permite índices específicos para queries de WooCommerce, mejor performance en catálogos grandes, y queries SQL más eficientes. Disponible desde WooCommerce 7.1, completamente estable desde 8.0. Para tiendas nuevas: activa HPOS desde el inicio. Para tiendas existentes: migrar requiere el proceso de migración incluido en WooCommerce.

¿Es seguro ejecutar DELETE en las tablas de WordPress directamente en MySQL?

Con precaución: sí. Antes de cualquier DELETE masivo: hacer backup completo de la base de datos. Empezar con queries de prueba usando SELECT primero para verificar qué se va a eliminar. Los transients y sessions expirados son seguros de eliminar. Los pedidos con status trash o failed son seguros si confirmas que no los necesitas. Nunca elimines directamente de wp_posts sin verificar el post_type primero.

¿Redis Object Cache funciona con hosting compartido?

Generalmente no. El hosting compartido rara vez incluye Redis. Redis Object Cache funciona con: VPS con acceso SSH, hosting managed de WordPress (Kinsta, WP Engine, Cloudways todos incluyen Redis). Si estás en hosting compartido y tienes problemas de performance: el primer paso es migrar a hosting con Redis antes de intentar otras optimizaciones.

¿Cuánto espacio libera la limpieza de la base de datos de WooCommerce?

Varía enormemente. Un WooCommerce de 3 años con 50,000 pedidos puede tener: wp_options con 200 MB de transients acumulados (fácilmente limpiables a 5-10 MB), wp_woocommerce_sessions con 100 MB de sesiones expiradas, wp_postmeta con fragmentación del 30-50% que se recupera con OPTIMIZE TABLE. Casos reales: tiendas que pasan de 2 GB a 500 MB de base de datos después de limpieza completa.