Guía para optimizar consultas MySQL en PrestaShop y acelerar tu tienda
¿Tu tienda PrestaShop va lenta? Si ya has descartado problemas de hosting o de configuración general, es muy probable que el cuello de botella esté en la base de datos. Cada vez que un cliente navega por tu catálogo, busca un producto o añade algo al carrito, tu tienda ejecuta cientos de prestashop consultas mysql. Si estas consultas no están optimizadas, el tiempo de respuesta se dispara y tus clientes acaban abandonando el carrito.
No te preocupes, no necesitas ser un experto en programación para mejorar el rendimiento mysql prestashop. En esta guía, pensada para ti, que gestionas tu propia tienda, vamos a ver paso a paso cómo optimizar mysql prestashop para que tu tienda vuele. Te explicaré qué es eso de las consultas lentas, cómo encontrarlas y, lo más importante, cómo solucionarlas sin romper nada. Vamos a ello.
¿Por qué es tan importante optimizar la base de datos?
Piensa en tu base de datos como el almacén de tu tienda física. Si tienes miles de productos (registros) amontonados sin orden ni control, encontrar un solo artículo (ejecutar una consulta) llevará muchísimo tiempo. PrestaShop necesita buscar en tablas enormes cada vez que alguien visita tu web.
Cuando optimizar base de datos prestashop no se hace correctamente, ocurre lo siguiente: el servidor tarda más en generar la página, el tiempo de carga aumenta, y Google castiga a las páginas lentas en los resultados de búsqueda. Además, en épocas de mucho tráfico (como el Black Friday), la tienda puede llegar a caerse.
La buena noticia es que, con un mantenimiento regular y algunas técnicas concretas, puedes reducir el tiempo de carga de tus páginas hasta en un 50% o más. No es magia, es simplemente hacer la limpieza y ordenar el almacén.
Primer paso: Activar el modo de depuración (Debug) para encontrar el problema
Antes de tocar nada, necesitas saber qué consultas son las que están tardando demasiado. PrestaShop tiene una herramienta integrada para esto, pero en las versiones modernas (1.7 y 8.x) está desactivada por defecto.
¿Cómo activar el modo Debug de forma segura?
- Accede a tu panel de control (si usas Syspanel, recuerda que la dirección es
https://tu-dominio:2106). - Entra en el administrador de archivos o usa un cliente FTP (como FileZilla) para conectarte a tu servidor.
- Busca la carpeta raíz de tu PrestaShop, normalmente llamada
public_htmlowww. - Dentro, busca el archivo llamado
config/defines.inc.php. - Ábrelo con un editor de texto (como el Bloc de notas o Visual Studio Code).
- Busca la línea que pone
define('_PS_MODE_DEV_', false);y cámbiala adefine('_PS_MODE_DEV_', true);. - Guarda el archivo y sube los cambios.
Ahora, cuando navegues por tu tienda como cliente, verás una barra gris en la parte inferior de la pantalla. Haz clic en el icono de la base de datos (una especie de cilindro). Se abrirá un panel con todas las prestashop consultas mysql que se han ejecutado. Verás columnas como Time, Query y Total. Ahí es donde empieza la diversión: busca las consultas que tarden más de 0.5 segundos o que se repitan muchísimas veces.
[WARNING]: No dejes el modo Debug activado para siempre. Es una puerta abierta para que cualquiera vea información sensible de tu tienda. Una vez hayas terminado de diagnosticar, vuelve a poner
define('_PS_MODE_DEV_', false);.
Segundo paso: Identificar las consultas lentas y repetitivas
Una vez que tienes el modo Debug activo, navega por las páginas más importantes de tu tienda: el inicio, una categoría grande, una ficha de producto y el carrito. Anota las consultas que aparecen una y otra vez con un tiempo alto.
Los principales sospechosos suelen ser:
- Consultas que buscan en tablas de combinaciones (product_attribute_combination): Esto es habitual si tienes muchos productos con atributos (tallas, colores).
- Consultas que buscan en tablas de búsqueda (search_index): Si tu buscador interno es lento, aquí está el problema.
- Consultas que cargan módulos mal optimizados: Algunos módulos hacen consultas innecesarias en cada página.
La solución rápida: El "Caché de consultas" (Query Cache)
PrestaShop tiene un sistema de caché en el servidor que guarda los resultados de las consultas más comunes. Si lo activas bien, no tendrás que ejecutar la misma consulta una y otra vez.
- Ve a tu panel de administración de PrestaShop.
- Navega a
Parámetros avanzados>Rendimiento. - En la sección
Caché, verás la opciónUsar caché de MySQL. - Actívala. También puedes elegir el nivel de caché (
Nivel 1es el más seguro,Nivel 2yNivel 3son más agresivos y pueden dar problemas con algunos módulos).
[TIP]: Empieza siempre con el Nivel 1. Si tu tienda va bien y no ves errores raros, sube al Nivel 2. El Nivel 3 solo es recomendable para tiendas muy grandes y con mucho tráfico, y puede causar conflictos con módulos de caché como Varnish.
Tercer paso: La limpieza profunda de la base de datos
Con el tiempo, tu base de datos se llena de "basura": revisiones antiguas de productos, pedidos cancelados, sesiones de usuarios caducadas, y tablas que ya no se usan. Esto hace que optimizar base de datos prestashop sea una tarea crítica.
Herramientas para limpiar
Puedes hacerlo manualmente con phpMyAdmin (desde tu panel de control o Syspanel), pero te recomiendo usar un módulo especializado. Los más conocidos y seguros son:
- PS Cleaner: Elimina datos huérfanos y optimiza las tablas.
- Advanced MySQL: Permite una limpieza más profunda.
Si prefieres hacerlo a mano con phpMyAdmin, estos son los pasos:
- Accede a phpMyAdmin desde tu panel de control.
- Selecciona tu base de datos (suele empezar con
prestashop_). - En la pestaña
SQL, ejecuta el siguiente comando para optimizar todas las tablas (esto las desfragmenta, como desfragmentar un disco duro de Windows de toda la vida):
OPTIMIZE TABLE
[INFO]: Este comando puede tardar unos minutos si tienes una base de datos grande. No cierres la ventana del navegador mientras se ejecuta.
Eliminar datos innecesarios
Además de optimizar, debes limpiar. Las tablas más problemáticas suelen ser:
ps_connectionsyps_connections_page: Guardan el historial de visitas.ps_guest: Guarda información de visitantes que no se registraron.ps_cartyps_cart_product: Carritos abandonados de hace meses.
Puedes eliminar registros antiguos (por ejemplo, de hace más de 6 meses) con comandos SQL. Por ejemplo, para limpiar carritos abandonados de hace más de 90 días:
DELETE FROM ps_cart WHERE date_add < DATE_SUB(NOW(), INTERVAL 90 DAY);
DELETE FROM ps_cart_product WHERE id_cart NOT IN (SELECT id_cart FROM ps_cart);
[WARNING]: Antes de ejecutar cualquier
DELETE, haz una copia de seguridad completa de tu base de datos. Si te equivocas, puedes borrar información crucial de pedidos o clientes.
Cuarto paso: Ajustar los índices de las tablas
Los índices son como el índice de un libro: le dicen a MySQL dónde están los datos sin tener que leer todo el libro. Si no hay índices, MySQL tiene que escanear fila por fila, lo que es lentísimo.
¿Cómo saber si falta un índice?
En el modo Debug que activamos antes, si una consulta tarda mucho, puedes copiarla y ejecutarla en phpMyAdmin. Te mostrará un mensaje de advertencia si hay una columna sin indexar. PrestaShop ya viene con índices básicos, pero a veces los módulos añaden tablas nuevas sin índices.
El índice más importante: id_product y id_product_attribute
Las consultas que más se ejecutan son las de los productos. Asegúrate de que las tablas ps_product, ps_product_lang, ps_product_shop y ps_product_attribute tengan un índice en la columna id_product y id_product_attribute.
Puedes añadir un índice manualmente con este comando en phpMyAdmin:
ALTER TABLE ps_product_lang ADD INDEX (id_product);
ALTER TABLE ps_product_attribute ADD INDEX (id_product_attribute);
[TIP]: Si no entiendes muy bien qué índices añadir, hay módulos como "MySQL Speed" que analizan tu base de datos y te sugieren exactamente qué índices crear.
Quinto paso: Configurar el almacenamiento de tablas (InnoDB)
PrestaShop funciona mejor con el motor de almacenamiento InnoDB en lugar del antiguo MyISAM. InnoDB permite bloqueos a nivel de fila (en lugar de tabla completa), lo que significa que varias personas pueden comprar a la vez sin ralentizarse.
Cómo cambiar el motor de almacenamiento
- Ve a phpMyAdmin.
- Selecciona tu base de datos.
- Haz clic en la pestaña
SQL. - Ejecuta este comando para cambiar todas las tablas a InnoDB:
ALTER TABLE nombre_de_tabla ENGINE=InnoDB;
Si tienes muchas tablas, te recomiendo un módulo que haga esto automáticamente. Hacerlo manualmente es tedioso y arriesgado.
[INFO]: Si tu hosting es muy antiguo y no soporta InnoDB correctamente, contacta con tu proveedor. En Syspanel y la mayoría de hosting modernos, InnoDB es el estándar por defecto.
Sexto paso: Optimizar la configuración de MySQL (my.cnf)
Este paso es más técnico, pero es el que más impacto tiene en el rendimiento mysql prestashop. Se trata de ajustar los parámetros del servidor MySQL. No te asustes, solo vamos a tocar los valores más importantes.
Los parámetros clave
query_cache_size: Este es el tamaño del caché de consultas. Si está muy bajo, las consultas se repiten. Un valor razonable para una tienda de tamaño medio es 128M.innodb_buffer_pool_size: Es la memoria que MySQL usa para guardar los datos en caché. La regla general es que ocupe el 70-80% de la RAM disponible de tu servidor. Si tu servidor tiene 4GB de RAM, poninnodb_buffer_pool_size = 3G.max_connections: El número máximo de conexiones simultáneas. Si tienes picos de tráfico, súbelo a200o300.
¿Cómo editar la configuración?
- Accede a tu servidor por SSH (o desde el administrador de archivos de Syspanel, el panel de control).
- Busca el archivo
my.cnfomy.ini(normalmente en/etc/mysql/o/etc/). - Edítalo con cuidado. Aquí tienes un ejemplo de configuración recomendada:
[mysqld]
query_cache_size = 128M
query_cache_type = 1
innodb_buffer_pool_size = 2G
max_connections = 200
- Guarda el archivo y reinicia MySQL con el comando
sudo systemctl restart mysqlosudo service mysql restart.
[WARNING]: Si pones un valor demasiado alto para
innodb_buffer_pool_size, el servidor se quedará sin memoria y se caerá. Empieza con un valor conservador y ve subiéndolo poco a poco.
Séptimo paso: Usar la caché de PrestaShop (Memcached o Redis)
La caché de MySQL que activamos antes es útil, pero no es la más rápida. Para un rendimiento realmente alto, necesitas usar Redis o Memcached. Estos sistemas guardan los resultados de las consultas en la memoria RAM del servidor, que es muchísimo más rápida que leer de la base de datos.
Cómo configurarlo
- Instala Redis o Memcached en tu servidor (desde Syspanel o por SSH con
sudo apt install redis-server). - Ve a
Parámetros avanzados>Rendimientoen tu PrestaShop. - En la sección
Caché, en lugar deUsar caché de MySQL, eligeUsar caché de MemcachedoUsar caché de Redis. - Introduce la dirección del servidor (normalmente
127.0.0.1) y el puerto (por defecto,6379para Redis y11211para Memcached).
[TIP]: Redis es más recomendable que Memcached porque soporta estructuras de datos más complejas y es más estable. La mayoría de expertos en optimizar mysql prestashop prefieren Redis.
Octavo paso: Reducir el número de consultas con la combinación de archivos (CCC)
PrestaShop tiene una opción llamada CCC (Combine, Compress and Cache) que combina los archivos CSS y JavaScript en un solo archivo. Esto no afecta directamente a la base de datos, pero reduce el número de peticiones al servidor, lo que libera recursos para las consultas MySQL.
- Ve a
Parámetros avanzados>Rendimiento. - Activa las opciones de
Combinar archivos JavaScriptyCombinar archivos CSS. - Activa también
Minimizar archivos JavaScriptyMinimizar archivos CSS.
Esto hará que el navegador del cliente descargue menos archivos, y el servidor no tenga que procesar tantas peticiones HTTP, lo que en última instancia ayuda a que acelerar prestashop mysql sea más efectivo.
Noveno paso: Archivar y limpiar las tablas de logs y estadísticas
PrestaShop registra muchísima información sobre las visitas, los clics y los errores. Con el tiempo, estas tablas (ps_log, ps_stats, ps_connections) crecen exponencialmente y ralentizan todas las demás consultas.
Programa una limpieza automática
Lo ideal es no hacerlo manualmente cada mes. Puedes usar un módulo como "Advanced MySQL" que programa limpiezas automáticas. O, si eres valiente, puedes crear un evento en MySQL:
CREATE EVENT limpiar_logs ON SCHEDULE EVERY 1 DAY DO DELETE FROM ps_connections WHERE date_add < DATE_SUB(NOW(), INTERVAL 30 DAY);
[INFO]: Este comando crea un evento que se ejecuta cada día y borra las conexiones de más de 30 días. Asegúrate de que tu hosting permite eventos MySQL (a veces están desactivados por seguridad).
Preguntas Frecuentes (FAQ)
¿Cada cuánto tiempo debo optimizar la base de datos?
Depende del tamaño de tu tienda y del tráfico. Como mínimo, una vez al mes. Si tienes una tienda grande con mucho movimiento, hazlo cada semana. Puedes programar la optimización de tablas con un cron job.
¿Puedo romper mi tienda si sigo estos pasos?
Sí, existe un riesgo, sobre todo si ejecutas comandos SQL incorrectos o tocas la configuración del servidor sin saber lo que haces. Por eso es obligatorio hacer una copia de seguridad antes de empezar. Si no te sientes seguro, contrata a un técnico especializado.
¿Por qué mi tienda sigue lenta después de optimizar MySQL?
Si ya has hecho todo esto y sigue lenta, el problema puede estar en el hosting (poca RAM, disco duro lento) o en el código de los módulos. A veces, un módulo mal programado hace consultas ineficientes que no se pueden arreglar con índices. Prueba a desactivar módulos uno a uno para encontrar al culpable.
