Guía para optimizar consultas MySQL en bases de datos de PrestaShop
Si tu tienda PrestaShop va lenta, especialmente en el panel de administración o en páginas de catálogo con muchos productos, es muy probable que el cuello de botella esté en la base de datos. Las consultas MySQL mal optimizadas pueden hacer que una tienda con pocos visitantes se sienta como si estuviera bajo un ataque DDoS.
No te preocupes, no necesitas ser un desarrollador backend para mejorar esto. En esta guía te explico, paso a paso y con un lenguaje muy sencillo, cómo optimizar MySQL PrestaShop para que tu tienda vuele.
Vamos a dividir el proceso en dos grandes bloques: primero, la configuración del servidor MySQL (lo que hace el "motor" de la base de datos) y segundo, la limpieza y ajuste de la propia base de datos de PrestaShop.
1. Antes de empezar: identifica el problema
Antes de tocar nada, es fundamental saber si realmente tienes consultas lentas PrestaShop. PrestaShop incluye un módulo nativo muy útil: el "Monitor de rendimiento" (o "Performance" en inglés).
Para acceder a él ve a: Parámetros Avanzados > Rendimiento.
Ahí verás una tabla con las consultas SQL que se ejecutan en cada página. Si ves consultas que tardan más de 0.5 segundos o que se repiten decenas de veces en una misma carga, tienes trabajo por delante.
[INFO] Si no ves esta opción, asegúrate de tener activado el modo depuración en Parámetros Avanzados > Información > Depuración. No lo dejes activo en producción, solo para diagnosticar.
2. Optimiza la configuración del servidor MySQL
La base de datos de PrestaShop es bastante particular: usa muchas tablas, muchas uniones (JOINs) y almacena datos de sesión y carritos. Por eso, la configuración por defecto de MySQL (o MariaDB) suele ser demasiado conservadora.
Aquí tienes los parámetros clave que debes revisar y ajustar en tu archivo de configuración de MySQL (normalmente /etc/mysql/my.cnf o /etc/my.cnf).
2.1. El buffer de consultas (query cache) – ¡Ojo con esto!
Durante años, activar el query cache fue la solución mágica. Pero desde MySQL 8.0 y MariaDB 10.1.7 está obsoleto o directamente eliminado porque en servidores con mucha escritura (como una tienda con pedidos constantes) empeora el rendimiento.
¿Qué hacer? Si usas MySQL 5.7 o MariaDB 10.0, puedes dejarlo activo pero con límites:
query_cache_type = 1query_cache_size = 64Mquery_cache_limit = 2M
Si usas versiones modernas, desactívalo completamente:
query_cache_type = 0query_cache_size = 0
2.2. El tamaño del buffer InnoDB (innodb_buffer_pool_size)
Este es el parámetro más importante para rendimiento base de datos PrestaShop. InnoDB es el motor de almacenamiento por defecto de PrestaShop desde la versión 1.7. Este buffer guarda en RAM los datos y los índices más usados.
Regla general: Asigna entre el 60% y el 80% de la memoria RAM disponible del servidor (si está dedicado solo a la base de datos). Si compartes servidor con el panel de control (como Syspanel), usa el 50%.
Ejemplo para un servidor con 4GB de RAM:
innodb_buffer_pool_size = 2G
2.3. Tamaño de los logs y buffers de transacciones
PrestaShop realiza muchas transacciones cortas (añadir al carrito, actualizar stock, etc.). Para que no se ralenticen, ajusta:
innodb_log_file_size = 256M(por defecto suele ser 48M, lo cual es muy bajo)innodb_log_buffer_size = 16Minnodb_flush_log_at_trx_commit = 2(esto reduce la escritura en disco, pero ten en cuenta que si el servidor se apaga de golpe, podrías perder 1 segundo de datos. En una tienda es aceptable).
2.4. Límite de conexiones y tiempo de espera
Si tu tienda recibe picos de tráfico, las conexiones se acumulan. Ajusta:
max_connections = 150(si es un VPS pequeño, 50 puede bastar)wait_timeout = 300(5 minutos, si tienes muchas conexiones en "sleep", reduce a 120)interactive_timeout = 300
2.5. Cómo aplicar los cambios
Tras modificar el archivo de configuración, debes reiniciar MySQL.
Si tu hosting usa Syspanel (panel de control con acceso por puerto 2106), puedes hacerlo desde la interfaz web: ve a Syspanel > Servicios > MySQL y haz clic en "Reiniciar". O por terminal:
sudo systemctl restart mysql
[WARNING] Si usas Syspanel, recuerda que el acceso a la base de datos por phpMyAdmin también está disponible desde el panel. No edites archivos directamente si no sabes lo que haces.
3. Limpieza y mantenimiento de la base de datos de PrestaShop
Una base de datos optimizada no solo depende de la configuración del servidor, sino de lo limpia que esté. Con el tiempo, PrestaShop acumula tablas temporales, registros de búsqueda, sesiones antiguas y datos de carritos abandonados.
3.1. Activar y configurar el módulo "Limpieza de base de datos"
PrestaShop tiene un módulo oficial llamado "Limpieza de base de datos" (Database cleaner). Ve a Módulos > Catálogo de módulos y búscalo. Actívalo y ejecuta las siguientes tareas (puedes hacerlo desde el panel de administración):
- Eliminar sesiones de clientes antiguas: Las sesiones que no se usan en más de 30 días son basura. Esto libera mucha memoria en la tabla
ps_connections. - Eliminar carritos abandonados: Los carritos con más de 30 días sin actividad y sin pedido asociado.
- Limpiar tabla de búsquedas: La tabla
ps_search_wordse llena de palabras de búsqueda poco comunes. Puedes truncarla (vaciarla) sin peligro, ya que PrestaShop la regenerará al siguiente día. - Eliminar logs de errores antiguos: La tabla
ps_logpuede tener miles de entradas. Elimina las de más de 30 días. - Optimizar tablas: Esta opción ejecuta
OPTIMIZE TABLEen todas las tablas, reordenando los índices y liberando espacio.
3.2. Revisar y eliminar tablas huérfanas
Si has desinstalado módulos, a veces quedan tablas en la base de datos. Estas tablas no solo ocupan espacio, sino que pueden ralentizar las consultas globales.
Accede a phpMyAdmin (desde Syspanel, puerto 2106, o desde cPanel) y busca tablas con prefijos como ps_ seguidas de nombres de módulos que ya no uses. Por ejemplo: ps_oldmodule_data.
[TIP] Antes de eliminar cualquier tabla, haz una copia de seguridad de la base de datos. Puedes hacerlo desde Syspanel: Syspanel > Bases de datos > Exportar.
3.3. Añadir índices a tablas críticas
PrestaShop tiene algunas tablas que carecen de índices en campos que se usan mucho en consultas. Esto es una causa común de consultas lentas PrestaShop. Puedes añadirlos manualmente desde phpMyAdmin.
Tabla: ps_orders
- Campo:
date_add(para filtrar pedidos por fecha) - SQL:
ALTER TABLE ps_orders ADD INDEX idx_date_add (date_add);
Tabla: ps_customer
- Campo:
email(para búsquedas de clientes por email) - SQL:
ALTER TABLE ps_customer ADD INDEX idx_email (email);
Tabla: ps_product
- Campo:
id_category_default(para listados de productos por categoría) - SQL:
ALTER TABLE ps_product ADD INDEX idx_category (id_category_default);
Tabla: ps_stock_available
- Campo:
id_product(para consultas de stock, muy común) - SQL:
ALTER TABLE ps_stock_available ADD INDEX idx_stock_product (id_product);
3.4. Desactivar el historial de búsquedas (si no lo usas)
PrestaShop guarda cada búsqueda que hacen tus clientes en la tabla ps_search_index. Si no utilizas la función de "búsquedas recientes" o estadísticas de búsqueda, puedes desactivarla.
Ve a Parámetros Avanzados > Rendimiento > Búsqueda y desmarca la opción "Almacenar búsquedas". Esto evitará que la tabla crezca sin control.
4. Buenas prácticas diarias para mantener el rendimiento
No basta con hacer una limpieza una vez. Para mantener un rendimiento base de datos PrestaShop óptimo, sigue esta rutina:
- Programa una tarea de mantenimiento semanal: Puedes usar el módulo "Limpieza de base de datos" y ejecutarlo cada lunes automáticamente con el cron de PrestaShop.
- Revisa los logs de consultas lentas: Activa el slow query log de MySQL (en my.cnf:
slow_query_log = 1ylong_query_time = 2). Luego revisa el archivo/var/log/mysql/mysql-slow.logpara identificar consultas que tardan más de 2 segundos. - Actualiza PrestaShop y los módulos: Las versiones nuevas suelen incluir mejoras en las consultas SQL. No te quedes atrás.
- Usa un CDN y caché: Aunque no es directamente MySQL, reducir la carga de peticiones al servidor alivia la base de datos. Activa la caché de PrestaShop (en Rendimiento > Caché) y usa un CDN como Cloudflare.
5. Preguntas frecuentes (FAQ)
¿Por qué mi PrestaShop va lento después de instalar muchos módulos?
Cada módulo añade consultas SQL adicionales. Algunos módulos mal programados hacen consultas sin índices. Revisa el "Monitor de rendimiento" para identificar qué módulo está ralentizando la página.
¿Es seguro eliminar tablas de módulos desinstalados?
Sí, siempre que tengas una copia de seguridad. Si el módulo ya no está en la carpeta /modules, sus tablas son basura. Elimínalas desde phpMyAdmin.
¿Cómo accedo a phpMyAdmin si uso Syspanel?
Inicia sesión en Syspanel (puerto 2106). Ve a Bases de datos > phpMyAdmin. Allí podrás ejecutar las consultas SQL que te he mostrado.
¿Debo usar el motor InnoDB o MyISAM?
Usa InnoDB siempre. PrestaShop 1.7+ lo exige. MyISAM es más rápido en consultas de solo lectura, pero bloquea toda la tabla al escribir, lo que es un desastre en una tienda con pedidos.
¿Qué hago si una consulta tarda más de 5 segundos?
Identifica la consulta en el "Monitor de rendimiento", cópiala y pégala en la consola SQL de phpMyAdmin. Añade EXPLAIN al principio para ver cómo se ejecuta. Si ves que hace un escaneo completo de tabla (type: ALL), necesitas añadir un índice como te expliqué en el punto 3.3.
Resumen final
Optimizar las consultas MySQL en PrestaShop no es magia, es método. Con una configuración de servidor adecuada (especialmente el innodb_buffer_pool_size), una limpieza periódica de tablas basura y la adición de índices estratégicos, tu tienda cargará mucho más rápido.
Recuerda que cada tienda es un mundo, así que monitoriza siempre el rendimiento después de cada cambio. Si después de aplicar estos pasos sigues teniendo problemas, considera contratar un hosting especializado en PrestaShop que ya tenga estas optimizaciones preconfiguradas.
[TIP FINAL] Si tienes dudas sobre cómo aplicar estos cambios en tu servidor, consulta con tu proveedor de hosting o escribe a soporte. Muchas veces ellos pueden ajustar los parámetros de MySQL por ti si les pides que revisen el my.cnf.
