Guía para optimizar consultas SQL en PrestaShop (MySQL/MariaDB)
Introducción: ¿Por qué tu PrestaShop va lento?
Si tu tienda online tarda en cargar, pierdes ventas. Es así de simple. Los estudios dicen que un segundo de retraso puede reducir las conversiones hasta un 20%. Y cuando hablamos de PrestaShop, una de las causas más comunes de lentitud no es el hosting ni el tema, sino las consultas SQL lentas que se ejecutan en tu base de datos MySQL o MariaDB.
PrestaShop es un software muy completo, pero también muy "hablador" con la base de datos. Cada página que carga puede ejecutar decenas o cientos de consultas. Si esas consultas no están optimizadas, tu base de datos se satura, el servidor sufre y el cliente final ve una rueda de carga infinita.
La buena noticia es que no necesitas ser un gurú de la programación para mejorar esto. Con una serie de pasos prácticos, puedes optimizar PrestaShop y hacer que las consultas SQL vuelen. En esta guía te explico todo, desde lo más básico hasta trucos más avanzados, con un lenguaje claro y ejemplos fáciles de copiar y pegar.
Vamos a ello.
¿Qué es una consulta SQL y por qué importa tanto?
Una consulta SQL es una "petición" que hace PrestaShop a la base de datos para obtener información: productos, precios, clientes, pedidos, etc. Piensa en la base de datos como un enorme archivador con miles de cajones. Cada consulta es como pedirle a un ayudante que busque un documento concreto.
Si el archivador está bien organizado (con índices, por ejemplo), el ayudante encuentra el papel al instante. Si está desordenado, tiene que revisar cajón por cajón, y eso tarda muchísimo. Eso es exactamente lo que pasa con las consultas SQL lentas.
En PrestaShop, las consultas más problemáticas suelen ser las que buscan productos por categoría, las que calculan precios con impuestos o las que cuentan visitas. Si no están bien indexadas, cada visita a tu tienda genera una carga enorme en el servidor.
Paso 1: Activa el log de consultas lentas (slow query log)
Antes de optimizar nada, necesitas saber qué consultas son las que van lentas. No tiene sentido cambiar cosas a ciegas. Para ello, activamos el registro de consultas lentas en MySQL/MariaDB.
### Cómo activarlo en tu servidor
- Accede a tu panel de control (por ejemplo, Syspanel, antes conocido como HestiaCP, que se accede por el puerto 2106) o por SSH si sabes usarlo.
- Abre el archivo de configuración de MySQL. Normalmente está en
/etc/mysql/my.cnfo/etc/mysql/mariadb.conf.d/50-server.cnf. - Busca la sección
[mysqld]y añade estas líneas:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-queries.log
long_query_time = 2
Eso significa que cualquier consulta que tarde más de 2 segundos se guardará en el archivo slow-queries.log.
- Reinicia MySQL para que los cambios surtan efecto:
sudo systemctl restart mysql
O si usas MariaDB:
sudo systemctl restart mariadb
[INFO] Si no tienes acceso SSH, muchos paneles de control como Syspanel (puerto 2106) tienen una sección de "Bases de datos" donde puedes activar logs o ver el rendimiento. Busca la opción "Slow Query Log" o "Registro de consultas lentas".
Una vez activado, deja pasar unas horas o un día para acumular datos. Después, revisa el archivo de log y verás qué consultas son las culpables de la lentitud.
Paso 2: Los índices MySQL: tus mejores amigos
Un índice en MySQL es como el índice de un libro. En lugar de leer página por página, el motor va directo a la sección que necesita. Sin índices, MySQL tiene que escanear toda la tabla, lo cual es lentísimo cuando tienes miles o millones de registros.
### Cómo comprobar si faltan índices
La forma más fácil es usar la herramienta EXPLAIN en una consulta lenta. Por ejemplo, si tienes una consulta que busca productos por categoría, puedes ejecutar:
EXPLAIN SELECT * FROM ps_category_product WHERE id_category = 5;
El resultado te mostrará algo como type: ALL o rows: 50000. Si ves ALL, significa que está escaneando toda la tabla. Eso es malo. Deberías ver ref o range, lo que indica que usa un índice.
### Índices imprescindibles en PrestaShop
Estos son los índices más importantes que PrestaShop necesita para funcionar rápido. Puedes crearlos desde phpMyAdmin o desde la línea de comandos.
ALTER TABLE ps_category_product ADD INDEX idx_category (id_category);
ALTER TABLE ps_category_product ADD INDEX idx_product (id_product);
ALTER TABLE ps_product ADD INDEX idx_active (active);
ALTER TABLE ps_product ADD INDEX idx_price (price);
ALTER TABLE ps_product_lang ADD INDEX idx_name (name);
ALTER TABLE ps_stock_available ADD INDEX idx_product_attribute (id_product_attribute);
[TIP] No crees índices en todas las columnas. Cada índice ocupa espacio y hace más lenta la escritura. Solo añade índices en las columnas que se usan en las cláusulas
WHERE,JOINoORDER BY.
Para ver qué índices ya existen en una tabla, usa:
SHOW INDEX FROM ps_product;
Si ves que faltan los que te he mencionado, créalos. Notarás la diferencia al instante.
Paso 3: Optimiza la configuración de MySQL/MariaDB
A veces no es culpa de las consultas, sino de que el servidor de base de datos está mal configurado. MySQL y MariaDB tienen parámetros que puedes ajustar para mejorar la velocidad de PrestaShop sin tocar ni una línea de código.
### Parámetros clave en my.cnf
[mysqld]
max_connections = 150
query_cache_type = 1
query_cache_size = 128M
tmp_table_size = 64M
max_heap_table_size = 64M
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_buffer_pool_size: Es el más importante. Debe ser el 70% de tu RAM disponible. Si tienes 4GB de RAM, pon2Go3G.query_cache_size: Cachea resultados de consultas repetidas. Útil para PrestaShop, pero si tienes mucha escritura puede ser contraproducente. Empieza con 128M y prueba.tmp_table_size: Para tablas temporales. Si son muy pequeñas, las consultas complejas fallan o van lentas.
[WARNING] No copies y pegues estos valores a lo loco. Cada servidor es diferente. Si pones un valor demasiado alto, podrías agotar la memoria del servidor y provocar un crash. Empieza por valores conservadores y ve subiendo poco a poco.
Después de cambiar la configuración, recuerda reiniciar MySQL.
Paso 4: Limpia tu base de datos de PrestaShop
Con el tiempo, PrestaShop acumula datos basura: revisiones de productos antiguas, sesiones caducadas, carritos abandonados, mensajes de error, etc. Toda esa basura hace que las tablas crezcan y las consultas sean más lentas.
### Tablas que puedes limpiar
Estas son las tablas más comunes que puedes vaciar sin miedo (siempre con copia de seguridad):
TRUNCATE TABLE ps_connections;
TRUNCATE TABLE ps_connections_page;
TRUNCATE TABLE ps_connections_source;
TRUNCATE TABLE ps_guest;
TRUNCATE TABLE ps_cart;
TRUNCATE TABLE ps_cart_product;
TRUNCATE TABLE ps_sessions;
[WARNING] Haz una copia de seguridad antes de borrar nada. Si tienes clientes con carritos activos, borrarlos puede molestarles. Programa esta limpieza en momentos de poco tráfico.
### Optimiza las tablas
Después de borrar datos, es buena idea optimizar las tablas para reorganizarlas y liberar espacio:
OPTIMIZE TABLE ps_product;
OPTIMIZE TABLE ps_category_product;
OPTIMIZE TABLE ps_stock_available;
O si prefieres optimizar todas las tablas de la base de datos:
-- En phpMyAdmin, selecciona la base de datos y ve a la pestaña "Operaciones" -> "Optimizar tablas".
Paso 5: Usa el caché de PrestaShop
PrestaShop tiene un sistema de caché que guarda resultados de consultas para no tener que repetirlas. Si no lo tienes activado, estás perdiendo una oportunidad enorme de optimizar PrestaShop.
### Cómo activar el caché
- Ve a Parámetros avanzados > Rendimiento en el panel de administración.
- Activa la opción "Cachear páginas".
- Elige el sistema de caché. Recomiendo "Memcached" o "APCu" si tu hosting lo soporta. Si no, usa "Sistema de archivos" (File System), que también funciona bien.
[TIP] Si usas Memcached, asegúrate de que la extensión PHP está instalada. Puedes comprobarlo desde "Información del servidor" en PrestaShop.
### Combínalo con el caché de MySQL
Además del caché de PrestaShop, puedes activar el query cache de MySQL (como vimos antes). Así, si dos visitantes piden la misma página, la segunda consulta se sirve directamente desde la caché, sin tocar la base de datos.
Paso 6: Evita módulos y overrides innecesarios
Muchas veces, la lentitud no viene de las consultas de PrestaShop, sino de módulos mal programados que lanzan consultas ineficientes. Revisa los módulos que tienes instalados y desactiva los que no uses.
Un consejo: si un módulo hace 20 consultas para mostrar un bloque pequeño, es un problema. Busca alternativas más ligeras o contacta con el desarrollador.
También revisa los overrides (sobrescrituras de clases). Si tienes muchos, puede que estén duplicando consultas o haciendo cosas extrañas. Desactívalos temporalmente para ver si la velocidad mejora.
Paso 7: Herramientas para monitorizar y diagnosticar
No tienes que adivinar qué va mal. Usa estas herramientas gratuitas para diagnosticar consultas SQL en PrestaShop:
- phpMyAdmin: Incluye una pestaña de "Estado" donde ves el rendimiento general de MySQL.
- MySQL Workbench: Tiene un panel de "Performance Reports" muy visual.
- PrestaShop Debug Mode: Actívalo desde
config/defines.inc.phpponiendodefine('_PS_MODE_DEV_', true);. Te mostrará el tiempo de cada consulta al final de la página.
[INFO] No dejes el modo debug activado en producción. Solo úsalo para diagnosticar y luego desactívalo.
Paso 8: Actualiza MySQL/MariaDB y PrestaShop
Parece obvio, pero mucha gente se olvida. Las versiones nuevas de MariaDB (especialmente la 10.4 y superiores) son mucho más rápidas que las antiguas. Si tu hosting te permite actualizar, hazlo.
Lo mismo con PrestaShop. Cada versión trae mejoras de rendimiento en las consultas SQL. Estar desactualizado es un riesgo de seguridad y de rendimiento.
Preguntas frecuentes (FAQ)
### ¿Cuánto tiempo tarda en notarse la mejora?
Depende. Si añades índices que faltaban, la mejora es inmediata. Si limpias la base de datos, también. La configuración de MySQL tarda un poco más en notarse porque requiere reiniciar el servicio.
### ¿Puedo hacer esto en un hosting compartido?
Algunas cosas sí: activar el caché de PrestaShop y limpiar tablas. Pero modificar my.cnf o activar logs no suele estar permitido en hosting compartido. En ese caso, habla con tu proveedor para que lo hagan ellos.
### ¿Es seguro truncar tablas como ps_cart?
Sí, siempre que tengas una copia de seguridad. Los carritos abandonados no afectan a pedidos completados. Pero si usas módulos de email marketing que se basan en carritos, puede que pierdas datos útiles.
### ¿Qué hago si una consulta tarda 10 segundos y no sé por qué?
Usa EXPLAIN para ver el plan de ejecución. Si ves ALL en la columna type, es que falta un índice. Añade el índice correspondiente y prueba de nuevo.
### ¿Syspanel me ayuda a gestionar MySQL?
Syspanel (antes HestiaCP, accesible por el puerto 2106) te permite gestionar bases de datos, ver logs y acceder a phpMyAdmin. No tiene opciones avanzadas de tuning de MySQL, pero sí te da acceso para hacer los cambios que necesites.
Conclusión
Optimizar PrestaShop no es un lujo, es una necesidad si quieres que tu tienda cargue rápido y convierta bien. Las consultas SQL son el corazón de tu tienda, y si van lentas, todo se resiente.
Resumiendo los pasos clave:
- Activa el log de consultas lentas para saber qué falla.
- Añade índices a las tablas principales.
- Ajusta la configuración de MySQL/MariaDB (buffer pool, query cache).
- Limpia y optimiza las tablas regularmente.
- Usa el caché de PrestaShop.
- Revisa módulos y overrides.
- Monitoriza con herramientas de diagnóstico.
- Actualiza todo a las últimas versiones.
Con estos pasos, notarás una mejora significativa en la velocidad de tu tienda. Y recuerda: si no te sientes seguro haciendo cambios técnicos, siempre puedes pedir ayuda a tu proveedor de hosting o a un especialista.
[TIP] Empieza por lo más fácil: limpia la base de datos y activa el caché. Esa combinación suele dar un gran alivio sin tocar nada técnico. Luego, ve con los índices y la configuración de MySQL.
Tu tienda (y tus clientes) te lo agradecerán. ¡Manos a la obra!
