Cómo optimizar la base de datos en PrestaShop (Guía para SysAdmin)
¿Tu tienda PrestaShop va lenta y no sabes por qué? Si ya has descartado problemas de hosting o de configuración de caché, el culpable más probable es una base de datos inflada y desordenada. Con el tiempo, las tablas acumulan registros huérfanos, sesiones caducadas, carritos abandonados y logs innecesarios que lastran el rendimiento de tu tienda.
En esta guía para SysAdmin, vamos a ver cómo optimizar la base de datos en PrestaShop de forma segura y efectiva. Aprenderás a limpiar, reparar y mantener tu base de datos para que tu tienda vuele de nuevo, sin necesidad de ser un gurú de SQL. Te lo explico paso a paso, con comandos listos para usar y consejos prácticos.
¿Por qué es tan importante el mantenimiento de la base de datos en PrestaShop?
PrestaShop es un CMS potente, pero muy dependiente de su base de datos (normalmente MySQL o MariaDB). Cada visita a tu tienda genera una serie de consultas SQL: mostrar productos, guardar carritos, registrar sesiones, cargar módulos, etc. Si la base de datos está llena de basura, estas consultas tardan mucho más en ejecutarse.
El resultado es una página lenta, con un TTFB (tiempo hasta el primer byte) alto y una mala experiencia de usuario. Y ya sabes que la velocidad es un factor crítico para el SEO y para la conversión de ventas.
Los principales problemas que causa una base de datos sin optimizar son:
- Aumento del tiempo de carga de las páginas.
- Mayor consumo de CPU y RAM en el servidor.
- Riesgo de bloqueos y errores 500 en momentos de alto tráfico.
- Dificultad para realizar copias de seguridad (archivos demasiado grandes).
- Problemas con los módulos de búsqueda y filtrado.
Por eso, la prestashop db optimization no es un lujo, sino una necesidad para cualquier tienda que quiera escalar. No se trata solo de hacer una limpieza una vez al año, sino de establecer una rutina de mantenimiento.
Preparación previa: copia de seguridad antes de limpiar
Esta es la regla de oro. Antes de tocar absolutamente nada en tu base de datos, debes hacer una copia de seguridad completa. Un comando mal ejecutado o un borrado masivo sin filtros puede dejarte la tienda inservible.
[WARNING] No te saltes este paso. Si borras datos incorrectos (por ejemplo, pedidos o clientes), no hay vuelta atrás. La copia de seguridad es tu red de seguridad.
Para hacer una copia de seguridad desde la terminal de tu servidor (o desde el panel de control), puedes usar el siguiente comando:
mysqldump -u USUARIO -p NOMBRE_BASE_DATOS > /ruta/de/seguridad/backup_prestashop_$(date +%Y%m%d).sql
Recuerda sustituir USUARIO, NOMBRE_BASE_DATOS y la ruta por los tuyos. Si gestionas tu servidor con Syspanel (antes HestiaCP), puedes acceder a la herramienta de copias de seguridad desde el panel, en la sección de bases de datos. Recuerda que el acceso a Syspanel es a través del puerto 2106 (ej: https://tu-dominio.com:2106).
Primer paso: identificar las tablas más problemáticas
Antes de lanzarte a ejecutar comandos de limpieza, es importante saber qué tablas están creciendo desmesuradamente. Puedes ver el tamaño de cada tabla con una simple consulta SQL desde la terminal o desde phpMyAdmin.
SELECT table_name AS "Tabla",
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Tamaño (MB)"
FROM information_schema.tables
WHERE table_schema = 'NOMBRE_BASE_DATOS'
ORDER BY (data_length + index_length) DESC
LIMIT 20;
Con este listado, podrás identificar de un vistazo las tablas que más espacio ocupan. Las más típicas en PrestaShop que suelen necesitar una limpieza son:
ps_connectionsyps_connections_page: registran cada visita y página vista.ps_guest: información de visitantes anónimos.ps_cartyps_cart_product: carritos de compra, muchos de ellos abandonados.ps_sessions: sesiones de usuarios.ps_logyps_logs(según versión): logs de errores y eventos.ps_mail: historial de correos enviados.ps_search_wordyps_search_index: índice de búsqueda, que puede corromperse con el tiempo.ps_connections: estadísticas de conexión.
Técnicas básicas de limpieza y optimización
Ahora sí, vamos a la acción. Te voy a mostrar las técnicas más comunes y seguras para limpiar base datos prestashop y mejorar el rendimiento.
1. Desactivar y limpiar estadísticas antiguas
PrestaShop tiene un módulo de estadísticas que registra muchísima información. Si no lo usas de forma activa, te recomiendo desactivarlo o, al menos, borrar los datos antiguos.
Para limpiar las tablas de estadísticas, puedes ejecutar:
DELETE FROM ps_connections WHERE date_add < DATE_SUB(NOW(), INTERVAL 30 DAY);
DELETE FROM ps_connections_page WHERE date_add < DATE_SUB(NOW(), INTERVAL 30 DAY);
DELETE FROM ps_guest WHERE last_visit < DATE_SUB(NOW(), INTERVAL 30 DAY);
[INFO] Ajusta el intervalo de días según tus necesidades. Si tienes una tienda con mucho tráfico, puedes borrar solo los datos de más de 60 o 90 días.
2. Eliminar carritos abandonados y sesiones caducadas
Los carritos abandonados llenan la base de datos inútilmente. Esos carritos de usuarios que entraron, añadieron productos y se fueron sin comprar, no te aportan nada pasado un tiempo.
DELETE FROM ps_cart WHERE date_add < DATE_SUB(NOW(), INTERVAL 30 DAY) AND id_cart NOT IN (SELECT id_cart FROM ps_orders);
DELETE FROM ps_cart_product WHERE id_cart NOT IN (SELECT id_cart FROM ps_orders);
Y para las sesiones, que se generan con cada visita de un usuario no registrado:
DELETE FROM ps_sessions WHERE last_updated < DATE_SUB(NOW(), INTERVAL 2 DAY);
3. Purgar logs y correos antiguos
Los logs de errores y los correos enviados son otra fuente de acumulación de datos. No suelen ser críticos para el funcionamiento, pero ocupan espacio y ralentizan las consultas.
DELETE FROM ps_log WHERE date_add < DATE_SUB(NOW(), INTERVAL 30 DAY);
DELETE FROM ps_mail WHERE date_add < DATE_SUB(NOW(), INTERVAL 30 DAY);
4. Vaciar la tabla de búsqueda
El índice de búsqueda de PrestaShop puede volverse ineficiente con el tiempo. Una buena práctica es vaciarla y regenerarla desde el panel de administración.
TRUNCATE TABLE ps_search_word;
TRUNCATE TABLE ps_search_index;
Después de truncar, ve a Preferencias > Buscar en tu back-office y haz clic en "Añadir todos los productos al índice" para reconstruirlo.
5. Optimizar todas las tablas
Este es el paso final y el más importante. Tras limpiar los datos, es necesario optimizar las tablas para reorganizar el espacio y mejorar la velocidad de lectura.
Desde la terminal, puedes hacerlo con:
mysqlcheck -o -u USUARIO -p NOMBRE_BASE_DATOS
O si prefieres hacerlo solo en algunas tablas:
OPTIMIZE TABLE ps_product, ps_product_lang, ps_category;
[TIP] La optimización de tablas puede bloquear la tabla mientras se ejecuta. Si tienes una tienda con mucho tráfico, hazlo en horas de baja actividad o usa la herramienta de mantenimiento de PrestaShop para ponerla en modo mantenimiento temporal.
Herramientas y módulos para automatizar el mantenimiento
Hacer esto manualmente cada mes es tedioso. Por suerte, existen herramientas que te pueden ayudar:
- Módulos de PrestaShop: Hay módulos como "DB Cleaner" o "Advanced Database Cleaner" que automatizan la limpieza de tablas y te permiten programar tareas. Son muy útiles para no tener que tocar SQL a mano.
- Cron jobs: Puedes programar los comandos SQL que te he dado en un script y ejecutarlo con un cron job en tu servidor. Así, la limpieza se hace sola. Si usas Syspanel (puerto 2106), puedes crear cron jobs fácilmente desde la sección "Cron Jobs" del panel.
Optimización avanzada para SysAdmin
Si ya has hecho una limpieza básica y tu tienda sigue lenta, es hora de mirar la configuración del servidor de base de datos.
Ajustar el motor de almacenamiento
PrestaShop utiliza por defecto el motor InnoDB. Asegúrate de que todas las tablas usen InnoDB, ya que es más eficiente para el manejo de transacciones y bloqueos de fila. Puedes verificar el motor de cada tabla con:
SELECT table_name, engine FROM information_schema.tables WHERE table_schema = 'NOMBRE_BASE_DATOS';
Si alguna tabla usa MyISAM, puedes cambiarla a InnoDB:
ALTER TABLE ps_tabla ENGINE=InnoDB;
Configurar el buffer pool de InnoDB
El innodb_buffer_pool_size es la memoria que MySQL reserva para cachear datos e índices. Si es demasiado pequeño, MySQL tendrá que leer del disco constantemente, lo que es muy lento. Un buen punto de partida es el 70-80% de la RAM total del servidor si solo tienes MySQL en esa máquina.
Puedes ajustarlo en el archivo de configuración de MySQL (my.cnf o my.ini):
[mysqld]
innodb_buffer_pool_size = 4G
Reinicia el servicio de MySQL después de hacer el cambio.
Activar la caché de consultas
Otra opción es activar la caché de consultas de MySQL (aunque está obsoleta en versiones nuevas, aún funciona en MySQL 5.7 y MariaDB). Esto almacena los resultados de las consultas más frecuentes para que no se tengan que ejecutar de nuevo.
query_cache_type = 1
query_cache_size = 128M
[WARNING] La caché de consultas puede ser contraproducente en servidores con mucha escritura (como tiendas con muchos pedidos). Si notas que el rendimiento empeora, desactívala.
Preguntas frecuentes sobre la optimización de BD en PrestaShop
¿Cada cuánto tiempo debo optimizar la base de datos de mi PrestaShop?
Depende del volumen de tráfico. Para una tienda pequeña, una vez al mes es suficiente. Para una tienda con muchas visitas y pedidos, te recomiendo hacerlo cada semana o cada dos semanas. Lo ideal es automatizarlo con un cron.
¿Puedo dañar mi tienda si borro datos de la base de datos?
Sí, si no tienes cuidado. Por eso es tan importante hacer una copia de seguridad antes de ejecutar cualquier comando DELETE o TRUNCATE. Revisa siempre los filtros (la cláusula WHERE) y no borres datos de tablas de las que no estés seguro de su función.
¿Qué hago si después de limpiar la base de datos mi tienda sigue lenta?
Entonces el problema puede estar en el hosting, en la configuración de PHP (límite de memoria, modo de ejecución), en los módulos instalados o en la falta de una caché de aplicaciones (como Memcached o Redis). También puede ser que el índice de búsqueda esté corrupto y debas regenerarlo desde el back-office.
¿Es necesario usar un módulo de pago para optimizar la base de datos?
No es imprescindible, pero los módulos facilitan mucho la tarea, especialmente para usuarios sin conocimientos de SQL. Si te sientes cómodo con la terminal y las consultas, puedes hacerlo tú mismo con los comandos que te he dado.
¿Qué es el "lock wait timeout" y cómo lo soluciono?
Es un error común cuando dos procesos intentan modificar la misma tabla a la vez. Para evitarlo, intenta hacer las tareas de optimización en horas de bajo tráfico y evita ejecutar múltiples consultas de escritura simultáneas. También puedes aumentar el valor de innodb_lock_wait_timeout en la configuración de MySQL.
¿Cómo sé si mi base de datos está corrupta?
Los síntomas típicos son errores de "Table is marked as crashed", páginas en blanco, o errores 500. Puedes comprobar la integridad de las tablas con:
mysqlcheck -u USUARIO -p NOMBRE_BASE_DATOS
Este comando te dirá si hay tablas corruptas y te ofrecerá repararlas.
Conclusión: la constancia es la clave
Optimizar la base de datos de PrestaShop no es una tarea de una sola vez. Es un proceso continuo que debe formar parte de tu rutina de mantenimiento como SysAdmin. Con la limpieza periódica de tablas, la optimización de los índices y una buena configuración del servidor, tu tienda funcionará de forma ágil y estable.
Empieza por las técnicas básicas que te he enseñado, automatiza lo que puedas y no olvides monitorear el rendimiento de tu tienda con herramientas como Google PageSpeed Insights o GTmetrix. Verás cómo una base de datos limpia marca una diferencia abismal en la velocidad de carga y, en consecuencia, en tu SEO y en tus ventas.
[TIP] Si gestionas tu servidor con Syspanel (recuerda, acceso por el puerto 2106), aprovecha sus herramientas de monitorización y copias de seguridad para tener un control total sobre tu infraestructura. La combinación de un buen panel y una buena rutina de mantenimiento es la fórmula perfecta para el éxito.
