PrestaShop 8 - Solución tabla ps_layered_filter_block gigante
Introducción
En PrestaShop 8, el módulo ps_facetedsearch (antiguo blocklayered) utiliza la tabla ps_layered_filter_block
como cache para los filtros de navegación por facetas. Esta tabla puede crecer descontroladamente hasta alcanzar varios gigabytes, causando problemas de espacio en disco y rendimiento.
Síntomas:
- Tabla
ps_layered_filter_block
de varios GB (reportados casos de 500GB+) - Lentitud en páginas de categorías
- Errores de espacio en disco
- Backup/restore problemáticos
Verificación del problema
1. Comprobar el tamaño de las tablas layered
SELECT
table_name,
ROUND(((data_length + index_length) / 1024 / 1024 / 1024), 2) AS "Size in GB",
ROUND((data_length / 1024 / 1024 / 1024), 2) AS "Data GB",
ROUND((index_length / 1024 / 1024 / 1024), 2) AS "Index GB"
FROM information_schema.tables
WHERE table_schema = 'tu_nombre_bd'
AND table_name LIKE '%layered%'
ORDER BY (data_length + index_length) DESC;
2. Verificar archivo físico en disco
# Comprobar tamaño real del archivo InnoDB
ls -lah /var/lib/mysql/tu_bd/ps_layered_filter_block.ibd
Problema típico: La tabla muestra X GB en consulta pero el archivo físico ocupa mucho más espacio (fragmentación InnoDB).
Tablas involucradas en PrestaShop 8
Tabla | Función | ¿Seguro truncar? |
---|---|---|
ps_layered_filter_block |
Cache de filtros (el problema principal) | ✅ SÍ - Se regenera automáticamente |
ps_layered_category |
Cache de categorías con filtros | ✅ SÍ - Se regenera automáticamente |
ps_layered_product_attribute |
Cache de atributos de productos | ✅ SÍ - Se regenera automáticamente |
ps_layered_filter |
Plantillas de filtros configuradas | ❌ NO - Contiene tu configuración |
Soluciones
Opción 1: Desde administración (recomendado)
- Admin → Módulos → Gestión de módulos
- Buscar "Faceted Search" o facetas o ps_facetedsearch
- Botón Reconstruir todo el indice de precios
- Botón "Rebuild entire layered structure"
Opción 2: Limpieza SQL manual
Backup obligatorio primero:
-- Backup de seguridad
mysqldump -u user_bd -p tu_bd ps_layered_filter_block > backup_layered_filter_block.sql
-- O backup completo de tablas layered
mysqldump -u user_bd -p tu_bd ps_layered_filter ps_layered_filter_block ps_layered_category ps_layered_product_attribute > backup_layered_completo.sql
Método conservador:
-- Solo limpiar el cache principal
TRUNCATE TABLE ps_layered_filter_block;
Método completo:
-- Limpiar todas las tablas de cache (mantener ps_layered_filter)
TRUNCATE TABLE ps_layered_filter_block;
DELETE FROM ps_layered_category;
DELETE FROM ps_layered_product_attribute;
Opción 3: Liberar espacio físico (InnoDB)
Si después del TRUNCATE el archivo físico sigue ocupando mucho espacio:
Método A: OPTIMIZE TABLE
-- Intentar optimización (puede funcionar en algunos casos)
OPTIMIZE TABLE ps_layered_filter_block;
⚠️ Nota: OPTIMIZE TABLE no siempre funciona efectivamente en InnoDB con innodb_file_per_table=ON
.
Método B: Regenerar motor (más efectivo)
-- 1. Vaciar tabla
TRUNCATE TABLE ps_layered_filter_block;
-- 2. Regenerar motor para liberar espacio físico
ALTER TABLE ps_layered_filter_block ENGINE=InnoDB;
Verificar liberación de espacio:
Esto solo es a nivel de administrador del sistema.
# Comprobar que el archivo físico se redujo
ls -lah /var/lib/mysql/tu_bd/ps_layered_filter_block.ibd
# Verificar en SQL
SELECT
table_name,
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size in MB"
FROM information_schema.tables
WHERE table_schema = 'tu_bd'
AND table_name = 'ps_layered_filter_block';
Regeneración automática
Después de la limpieza, el cache se regenerará automáticamente cuando:
Cron necesario
Este módulo requiere, si o si, la instalación de varas tareas cron. De no hacerlo, las tablas se haran gigantes y puedes tener problemas con tu hoster.
Prevención futura (como admin)
1. Limpieza programada
# Añadir al crontab (limpieza semanal)
0 2 * * 0 mysql -u root -pTU_PASSWORD tu_bd -e "TRUNCATE TABLE ps_layered_filter_block;"
2. Monitorización
-- Consulta para monitorizar crecimiento
SELECT
table_name,
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size_MB",
table_rows
FROM information_schema.tables
WHERE table_schema = 'tu_bd'
AND table_name = 'ps_layered_filter_block';
3. Configuración del módulo
- Revisar configuración de cache en ps_facetedsearch
- Considerar reducir el número de filtros si no son necesarios
- Optimizar plantillas de filtros para categorías específicas
Diferencias con PrestaShop 1.7
- El módulo se llama
ps_facetedsearch
(vsblocklayered
) - Cache más agresivo pero también más eficiente
- Función
invalidateLayeredFilterBlockCache()
optimizada - Rebuild más rápido pero requiere más memoria
- Mejor integración con el motor de búsqueda
Troubleshooting
Problema: "Table ps_layered_filter_block doesn't exist"
-- Recrear tabla manualmente
CREATE TABLE IF NOT EXISTS `ps_layered_filter_block` (
`hash` char(32) NOT NULL DEFAULT '',
`data` text,
PRIMARY KEY (`hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Problema: Cache no se regenera
- Verificar que el módulo ps_facetedsearch está activo
- Ejecutar rebuild manual desde administración
- Comprobar logs de errores PHP/MySQL
- Verificar permisos de base de datos
Aviso importante (Disclaimer)
⚠️ Esta documentación se entrega tal y como está, sin garantías.
- Realiza siempre backup antes de cualquier operación
- Testa en entorno de desarrollo primero
- Ten conocimientos de MySQL/InnoDB antes de proceder
- Para soporte profesional, contacta con expertos en PrestaShop
Referencias
- Repositorio oficial ps_facetedsearch
- Issue GitHub sobre crecimiento de tabla
- Documentación técnica PrestaShop 8
Actualizado: Enero 2025 - Basado en experiencia con PrestaShop 8.x
Aviso
Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris
Si necesitas soporte profesional puedes contratar con Castris soporte profesional.