Cómo optimizar bases de datos MySQL para acelerar PrestaShop
¿Tu tienda PrestaShop va lenta? Si ya has probado a optimizar imágenes o activar la caché de Smarty y el problema persiste, es muy probable que el cuello de botella esté en la base de datos MySQL.
Cuando tu tienda crece, el número de pedidos, clientes y productos hace que las consultas a la base de datos sean cada vez más pesadas. Una base de datos desordenada es como un armario lleno de ropa sin doblar: tarde o temprano, tardas muchísimo en encontrar lo que buscas.
En esta guía extensa y práctica, vamos a desglosar, paso a paso y sin tecnicismos innecesarios, cómo optimizar MySQL PrestaShop para que tu tienda vuele. No necesitas ser un gurú de la programación, solo seguir estas instrucciones con calma.
Empecemos.
¿Por qué MySQL es tan importante para el rendimiento de PrestaShop?
PrestaShop guarda absolutamente todo en la base de datos: productos, precios, clientes, pedidos, módulos, configuración y sesiones. Cada vez que un usuario visita tu tienda, el servidor ejecuta decenas de consultas SQL para mostrar la página.
Si esas consultas son lentas o la base de datos está inflada con basura, el tiempo de carga se dispara. Y ojo, un segundo de retraso puede reducir tus conversiones hasta en un 20%. Por eso, optimizar mysql prestashop no es un lujo, es una necesidad para competir en el mercado actual.
El rendimiento prestashop depende en gran medida de tres pilares: el servidor, el código y la base de datos. Hoy nos centramos en la base de datos, que es donde más se nota la mejora con poco esfuerzo.
Preparación: Antes de tocar nada, haz una copia de seguridad
Esta es la regla de oro. Antes de ejecutar cualquier comando o modificar la configuración, debes tener una copia de seguridad completa de tu base de datos. Un error de dedo podría borrar información crítica de tu tienda.
Puedes hacerlo desde el panel de control de tu hosting (normalmente suele ser phpMyAdmin) o mediante la herramienta de copias de seguridad de tu panel de administración. Si usas un panel como Syspanel (accesible por el puerto 2106), busca la sección de "Bases de Datos" y exporta un archivo .sql.
[WARNING] No continúes con esta guía si no tienes una copia de seguridad reciente y verificada. La prevención es la mejor cura para un dolor de cabeza monumental.
Paso 1: Activa la caché de MySQL (Query Cache)
La caché de MySQL guarda en memoria los resultados de las consultas más frecuentes. Cuando un cliente vuelve a pedir la misma información, el servidor la devuelve al instante sin volver a calcularla. Es como tener la respuesta de un examen memorizada.
En versiones antiguas de MySQL (5.7 y anteriores) esta caché era muy útil. Si tu hosting usa MySQL 5.7, puedes activarla. Si usas MySQL 8.0, esta funcionalidad se eliminó por completo, así que no pierdas tiempo buscándola.
Para activarla en MySQL 5.7, debes acceder al archivo de configuración my.cnf (o my.ini en Windows). Normalmente está en /etc/mysql/ o /etc/my.cnf.
Dentro del archivo, en la sección [mysqld], añade o modifica estas líneas:
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M
- query_cache_type: 1 significa que la caché está activada.
- query_cache_size: El tamaño total de la caché. 128MB es un buen punto de partida para tiendas medianas.
- query_cache_limit: El tamaño máximo de una consulta individual que se guardará. 2MB es suficiente.
Una vez guardado el archivo, reinicia el servicio de MySQL (o MariaDB).
[TIP] Si tu hosting es compartido, no podrás modificar este archivo. En ese caso, contacta con tu proveedor y pregúntales si tienen activada la caché de consultas. Es una de las primeras preguntas que debes hacer.
Paso 2: Ajusta el motor de almacenamiento (InnoDB)
PrestaShop funciona perfectamente con el motor InnoDB, que es el estándar en MySQL y MariaDB. Este motor es más robusto y soporta transacciones, lo que evita errores de datos.
Dentro de la configuración de InnoDB, hay un parámetro clave: el innodb_buffer_pool_size. Este valor define cuánta memoria RAM usará MySQL para almacenar en caché los datos y los índices. Cuanto más grande sea, menos accesos al disco duro, y por lo tanto, más rápida será la tienda.
La regla general es asignarle entre el 60% y el 70% de la memoria RAM total del servidor. Si tu servidor tiene 8GB de RAM, asigna 5GB a este parámetro.
En my.cnf, dentro de [mysqld], añade:
innodb_buffer_pool_size = 5G
[INFO] No asignes más del 80% de la RAM a MySQL, porque el sistema operativo y el servidor web (Apache/Nginx) también necesitan memoria para funcionar. Si te pasas, el servidor podría caerse por falta de recursos.
Paso 3: Revisa y optimiza los índices de las tablas
Los índices son como el índice alfabético de un libro. Sin ellos, el motor de base de datos tiene que leer toda la tabla para encontrar una fila. Con ellos, encuentra la fila al instante.
PrestaShop ya crea índices por defecto, pero a veces, con el tiempo y la instalación de módulos, se crean índices duplicados o faltan índices en columnas que se usan mucho en las consultas.
Para ver los índices de una tabla, ve a phpMyAdmin, selecciona tu base de datos y haz clic en una tabla específica (por ejemplo, ps_orders). Luego ve a la pestaña "Estructura" y al final verás los índices.
¿Cómo saber qué índices faltan? Puedes activar el "slow query log" en MySQL para ver qué consultas tardan más de un segundo. Pero eso es complejo. Una alternativa más sencilla es usar el módulo de PrestaShop llamado "MySQL Performance" o consultar a tu desarrollador.
Sin embargo, hay una acción segura que puedes hacer: eliminar índices duplicados. Estos se crean a menudo al desinstalar módulos. Un índice duplicado ocupa espacio y ralentiza las escrituras (insertar/actualizar datos).
Puedes usar esta consulta SQL en phpMyAdmin para ver los índices duplicados:
SELECT s.TABLE_NAME, s.INDEX_NAME, s.COLUMN_NAME, s.SEQ_IN_INDEX,
(SELECT COUNT(*) FROM information_schema.STATISTICS s2
WHERE s2.TABLE_NAME = s.TABLE_NAME AND s2.COLUMN_NAME = s.COLUMN_NAME
AND s2.SEQ_IN_INDEX = s.SEQ_IN_INDEX AND s2.INDEX_NAME <> s.INDEX_NAME) AS duplicate_count
FROM information_schema.STATISTICS s
HAVING duplicate_count > 0;
Si el resultado devuelve filas, significa que tienes índices duplicados. Para eliminarlos, usa el comando DROP INDEX:
ALTER TABLE `ps_orders` DROP INDEX `nombre_del_indice_duplicado`;
[WARNING] No elimines índices si no estás seguro de lo que haces. Si la consulta anterior te da un resultado vacío, no toques nada. Es mejor pecar de conservador que romper la tienda.
Paso 4: Utiliza el "Database Optimization" de PrestaShop
PrestaShop tiene una herramienta nativa para limpiar la base de datos. No es la más potente, pero es un buen comienzo y es segura.
Ve a tu panel de administración de PrestaShop, luego a Parámetros Avanzados > Rendimiento. Dentro de esta sección, busca la pestaña o botón llamado "Optimización de la base de datos" o "Database Optimization".
Aquí puedes hacer dos cosas:
- Eliminar datos de depuración: Limpia tablas temporales que ya no sirven.
- Optimizar las tablas: Ejecuta el comando
OPTIMIZE TABLEen todas las tablas. Esto reorganiza el almacenamiento físico de los datos y libera espacio no utilizado.
Es recomendable ejecutar esta optimización una vez al mes, especialmente si añades y eliminas productos con frecuencia.
[INFO] La optimización de tablas puede bloquear temporalmente la escritura en esa tabla. Por eso, es mejor hacerlo en horas de baja afluencia de clientes, como a las 3 de la mañana.
Paso 5: Limpia las tablas de sesiones y carritos abandonados
PrestaShop guarda las sesiones de los usuarios en la tabla ps_connections y ps_guest. Con el tiempo, esta tabla se llena de registros de visitas antiguas, carritos abandonados y sesiones caducadas.
Una tabla de sesiones enorme ralentiza todas las consultas que la involucran. Puedes limpiarla manualmente con una consulta SQL.
Para eliminar sesiones con más de 30 días de antigüedad, ejecuta:
DELETE FROM ps_connections WHERE date_add < DATE_SUB(NOW(), INTERVAL 30 DAY);
También puedes limpiar carritos que no se han convertido en pedidos:
DELETE FROM ps_cart WHERE date_add < DATE_SUB(NOW(), INTERVAL 30 DAY) AND id_cart NOT IN (SELECT id_cart FROM ps_orders);
[TIP] Puedes automatizar esta limpieza creando un evento en MySQL (EVENT) o configurando una tarea cron en tu hosting. Sin embargo, para la mayoría de usuarios, hacerlo manualmente una vez al mes es suficiente.
Paso 6: La caché de PrestaShop (Cache de consultas)
PrestaShop tiene su propio sistema de caché para evitar consultas repetitivas a la base de datos. En Parámetros Avanzados > Rendimiento, encontrarás la opción "Caché de plantillas" y "Caché de consultas".
Activa la "Caché de consultas" y elige un sistema de caché. Te recomiendo usar Memcached o Redis si tu hosting lo permite, ya que son mucho más rápidos que el sistema de archivos (File System).
Si no tienes acceso a Memcached o Redis, usa "File System" (sistema de archivos). Es mejor que nada, pero ten en cuenta que genera muchos archivos en el servidor, lo que puede ralentizar el disco duro.
La caché de consultas de PrestaShop guarda los resultados de las consultas SQL en memoria o en archivos, reduciendo la carga de MySQL. Esto complementa perfectamente la caché de MySQL que configuramos en el paso 1.
[WARNING] Al activar la caché de consultas, es posible que veas datos desactualizados temporalmente si un módulo modifica la base de datos directamente. Si notas algo raro, puedes limpiar la caché desde el mismo panel presionando el botón "Borrar caché".
Paso 7: Desactiva módulos innecesarios y logs
Cada módulo activo en PrestaShop añade consultas a la base de datos. Si tienes módulos que no usas, desactívalos. No solo mejorará el rendimiento prestashop, sino que también reducirá el riesgo de conflictos.
Además, PrestaShop guarda un log de errores y eventos en la tabla ps_log. Con el tiempo, esta tabla puede crecer muchísimo. Puedes vaciarla con:
TRUNCATE TABLE ps_log;
También puedes desactivar el log de errores en Parámetros Avanzados > Rendimiento > Depuración y ponerlo en "Nunca" para evitar que se escriban logs en producción.
Paso 8: Considera migrar a MariaDB
Si tu hosting te lo permite, migrar de MySQL a MariaDB es una excelente opción. MariaDB es un fork de MySQL creado por los desarrolladores originales, y es conocido por ser más rápido y eficiente en entornos de alto tráfico.
La mayoría de los paneles de control modernos, como Syspanel (puerto 2106), ofrecen la instalación de MariaDB fácilmente. La migración es casi transparente, ya que es compatible con las mismas consultas SQL y herramientas.
[INFO] Si tu tienda ya funciona bien con MySQL, no tienes que migrar. Pero si buscas un plus de rendimiento, MariaDB es una opción sólida y sin coste adicional.
Preguntas Frecuentes (FAQ)
¿Cada cuánto tiempo debo optimizar la base de datos de PrestaShop?
Depende del tamaño de tu tienda. Para tiendas pequeñas, una vez al mes es suficiente. Para tiendas grandes con mucho tráfico, te recomiendo hacerlo semanalmente. La optimización de tablas (Paso 4) y la limpieza de sesiones (Paso 5) son las tareas más importantes.
¿Qué hago si mi hosting es compartido y no tengo acceso a my.cnf?
No te preocupes. Aún puedes aplicar los pasos 3, 4, 5, 6 y 7. La caché de consultas de PrestaShop (Paso 6) es muy efectiva y no requiere acceso al servidor. También puedes preguntar a tu proveedor si tienen activada la caché de MySQL.
¿Puedo romper mi tienda si ejecuto las consultas SQL del artículo?
Sí, existe un riesgo si no sabes lo que haces. Por eso insisto en la copia de seguridad previa. Las consultas de limpieza (DELETE) son bastante seguras, pero las de modificación de índices (DROP INDEX) requieren más cuidado. Si no estás seguro, ejecuta primero la consulta SELECT para ver qué índices son duplicados y consulta con tu soporte técnico.
¿Cuál es la diferencia entre la caché de MySQL y la caché de PrestaShop?
La caché de MySQL es a nivel de servidor y guarda los resultados de las consultas para cualquier aplicación. La caché de PrestaShop es a nivel de aplicación y guarda los resultados de las consultas específicas que hace el software. Ambas son complementarias y recomendables.
¿Por qué mi tienda sigue lenta después de aplicar todo esto?
Si has aplicado todos los pasos y sigue lenta, el problema puede estar en el servidor (falta de RAM o CPU), en el hosting (demasiados sitios en el mismo servidor) o en un módulo mal programado. Te recomiendo revisar el tiempo de respuesta del servidor y, si es posible, cambiar a un plan de hosting dedicado o VPS.
Conclusión y resumen de acciones
Optimizar mysql prestashop es un proceso continuo, no una acción única. Con estos pasos, habrás mejorado drásticamente el rendimiento prestashop de tu tienda.
Para resumir, tu checklist de optimización es:
- Copia de seguridad (imprescindible).
- Activa la caché de MySQL (si usas 5.7).
- Ajusta el buffer pool de InnoDB (si tienes acceso).
- Elimina índices duplicados (con cuidado).
- Usa la herramienta de optimización de PrestaShop (mensual).
- Limpia sesiones y carritos abandonados (mensual).
- Activa la caché de consultas de PrestaShop (Memcached/Redis si es posible).
- Desactiva módulos y logs innecesarios.
- Valora migrar a MariaDB.
Lleva un registro de tus tiempos de carga antes y después de aplicar estos cambios. Verás una mejora notable. Si tienes dudas, no dudes en consultar con tu proveedor de hosting. Una base de datos optimizada es la clave para una tienda rápida y exitosa. ¡Mucha suerte!
