Skip to main content

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)

  1. Admin → Módulos → Gestión de módulos
  2. Buscar "Faceted Search" o facetas o ps_facetedsearch
  3. Botón Reconstruir todo el indice de precios
  4. 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:

  • Los usuarios naveguen por categorías con filtros
  • Se ejecute el rebuild desde administración
  • Se indexen productos

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.

PRESTASHOP 1.8 - Módulo Faceted search

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 (vs blocklayered)
  • 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

  1. Verificar que el módulo ps_facetedsearch está activo
  2. Ejecutar rebuild manual desde administración
  3. Comprobar logs de errores PHP/MySQL
  4. 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


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.