¿Cuándo se invalidan los índices?


23

Tengo una tienda y todo el tiempo TODOS los índices no son válidos. Me di cuenta de que no tengo ni idea, cuando se invalida un índice.

¿Me puede dar una lista de "todos" los eventos, que hacen que uno o más de estos índices sean inválidos?

  • Atributos del producto
  • Precios del producto
  • Reescrituras de URL de catálogo
  • Datos planos del producto
  • Categoría de productos
  • Índice de búsqueda en el catálogo
  • Datos de agregación de etiquetas
  • Estado del stock

Respuestas:


18

Hacer un grep en el directorio de código le dará una lista de archivos que desencadenará una invalidación. grep -Ri '::STATUS_REQUIRE_REINDEX' .

Los siguientes archivos principales desencadenan una invalidación

./core/Mage/CatalogSearch/Model/Indexer/Fulltext.php
./core/Mage/Catalog/Model/Product/Indexer/Flat.php
./core/Mage/Catalog/Model/Product/Indexer/Price.php
./core/Mage/Catalog/Model/Category/Indexer/Flat.php
./core/Mage/Catalog/Model/Category/Indexer/Product.php
./core/Mage/Catalog/Model/System/Config/Backend/Catalog/Product/Flat.php
./core/Mage/Catalog/Model/System/Config/Backend/Catalog/Category/Flat.php
./core/Mage/Catalog/Model/Indexer/Url.php
./core/Mage/Backup/Helper/Data.php
./core/Mage/CatalogInventory/Model/Indexer/Stock.php
./core/Mage/ImportExport/Model/Import.php

Los eventos básicos en el núcleo Magento CE son

Atributos del producto

atributo de guardado específico (es parte del producto plano), tienda, grupo de tiendas si el producto de catálogo plano está habilitado

Precios del producto

comprobando los ajustes de configuración guardar (como el alcance del precio). o guardar producto, crear / eliminar sitio web

Reescrituras de URL de catálogo

sin invalidación específica

Datos planos del producto

Atributo de guardado específico (es parte del producto plano), si el producto de catálogo plano está habilitado, después de habilitar el producto plano

Datos planos de categoría

La verificación es la categoría de catálogo plana está habilitada y la categoría de guardar específica, después de habilitar la categoría plana

Categoría de productos

la verificación es plana, la categoría del catálogo está habilitada y la categoría de guardar específica

Índice de búsqueda en el catálogo

atributo de guardado específico (es parte de los atributos de búsqueda), tienda, grupo de tiendas si el producto de catálogo plano está habilitado

Datos de agregación de etiquetas

Nunca invalidado excepto las condiciones generales mencionadas a continuación

Estado del stock

Sistema específico> Configuración de configuración en la pestaña de inventario guardar, mostrar productos agotados, por ejemplo

Todos ellos se invalidan después de una reversión en la copia de seguridad System > Tools > Backupy la creación, eliminación o movimiento de sitios web, tiendas y vistas de tiendas. Después de ejecutar las importaciones de flujo de datos para el producto, se invalida lo siguiente: catalog_product_price, catalog_category_product, catalogsearch_fulltext, catalog_product_flat

Varios indexadores, como los datos planos y el indexador de URL, también parecen estar invalidados al guardar core_config_datavalores.


14

Tal vez sea una idea crear temporalmente una reescritura para este sitio en

Mage_Index_Model_Resource_Process

Luego haz algo como:

<?php

class YourNamespace_YourModule_Model_Resource_Process
    extends Mage_Index_Model_Resource_Process
{

    public function updateStatus($process, $status)
    {
        if ($status === Mage_Index_Model_Process::STATUS_REQUIRE_REINDEX) {
            Mage::log(sprintf('Indexer %s was invalidated.', $process->getIndexer()->getName()), null, 'invalid_index.log', true);
            foreach (debug_backtrace() as $db) {
                Mage::log(sprintf('%s::%s', $db['class'], $db['function']), null, 'invalid_index.log', true);
            }
        }
        return parent::updateStatus($process, $status);
    }

}

Eso debería determinar fácilmente cuándo se invalida un indexador y el seguimiento de la llamada responsable de ello.


10

Dado que otros ya han respondido a sus preguntas específicas. Pensé que podría ser mejor explicar por qué es necesaria la indexación y cómo se relaciona con Magento y la relación con las bases de datos modernas .

Índice: una lista alfabética de nombres, temas, etc., con referencias a los lugares donde ocurren, que generalmente se encuentran al final de un libro.

Entonces, ¿qué es exactamente un índice en términos de bases de datos ?

Un índice es una estructura de datos que clasifica varios registros en uno o más campos y acelera la recuperación de datos. Esto es para evitar escanear a través de los bloques de disco que abarca una tabla, al buscar en la base de datos.

¿Y qué indexación es en términos de Magento ? El subproducto de EAV (Entity Attribute Value) también conocido como una base de datos dentro de una base de datos. Con múltiples tablas de búsqueda, reúne todos los atributos marcados como indexados para combinarlos en una tabla plana de todas las tablas de búsqueda, para consultas más rápidas y menos E / S, y ciclos de CPU.

Recuerdo una mención de que cuando Magento se estaba desarrollando inicialmente, la flexibilidad ocupaba un lugar destacado en la lista de prioridades, lo cual es comprensible por qué eligieron ir con el modelo de datos EAV. Sin embargo, en última instancia, el costo de tal flexibilidad tuvo un costo de rendimiento y ha afectado a Magento desde el principio.

En general, los ingenieros de Magento tenían la tarea, ante todo, de construir el sistema más flexible y personalizable posible, y preocuparse por el rendimiento más adelante. ¿Por qué es tan lento Magento?

EAV es excelente para el almacenamiento de datos, pero terrible para las transacciones. Entonces, ¿por qué necesitamos índices para empezar? Dado que se ha vuelto a implementar el mismo enfoque del modelo relacional, Magento ahora tiene que manejar todas las cosas que MySQL hace internamente. Algunas cosas a tener en cuenta, como los índices ya existentes en las tablas MySQL. Con eso en mente también, considere el modelo de datos EAV ahora:

  • E ntidad = Tabla
  • Un atributo = campo
  • V alue = Valor

Lo mismo tiene que ser reimplementado, lo cual es una OMI muy "antipatrón".

Además, esta es la misma razón por la que encuentra var/locksque el indexador usa para bloquear el proceso de indexación. Las mismas razones por las que las bases de datos tienen bloqueo de fila / tabla.

Ahora, cuando un registro, digamos que el valor de un producto ha cambiado, flat tableo index(como lo referiría MySQL) debe actualizarse para que se reflejen las consultas sobre los datos recientemente cambiados que se encuentran de forma rápida y eficiente sin escanear a través de numerosos registros. Las tablas planas existen como se usaban en la misma razón por la que MySQL las tiene, sin dicho índice (como un libro) requiere un escaneo completo de la tabla para recuperar el registro. Esto significa grandes cantidades de E / S tanto para el disco y la memoria como para los ciclos de la CPU para localizar los datos solicitados, lo que es muy malo para el rendimiento.

Dado que Magento usa el modelo de datos EAV, existen numerosas tablas de búsqueda que deben escanearse para juntar todos los datos para localizar los datos que se han solicitado. Esto es lo que sucede si deshabilita los catálogos Flat. Al igual que MySQL, escaneando el registro en comparación con el uso de un índice (tabla plana) que se utilizará para ubicar el registro rápidamente mientras se conservan los preciosos ciclos de E / S. Crear una tabla y no agregar ningún índice es lo mismo que no usar las tablas planas en magento. Si bien estos dos escenarios pueden funcionar bien en diferentes escenarios, vea a Ben en la muy buena respuesta de Sonassi a esta pregunta. (Sugerencia: implica comprender el alcance de los datos).

Si bien no es una respuesta directa a su pregunta, comprender las partes móviles y estar mejor preparado para ellas debería ayudar a aliviar algunos de los dolores de cabeza que conlleva la indexación. " Trata el problema en lugar del síntoma " .

Explorar más en lo interno de los sistemas de bases de datos modernos puede ayudar a comprender mejor cómo y por qué la indexación es necesaria y cómo se relaciona (algo) con la indexación de Magento también.

Para resumir: Comprenda los alcances de sus problemas antes de aplicar soluciones a ciegas. Como no todos los datos serán exactamente iguales y la planificación y la implementación de soluciones DESPUÉS de que tenga una buena / plena comprensión del problema. La optimización de la base de datos puede ser muy gratificante para la gestión del cambio. Tales como prevenir lo temido DEADLOCKS.

También puede considerar configurar todos sus indexadores Manualy configurar procesos alternativos para reconstruir el índice en las horas de menor actividad (cuando los administradores están ausentes). Solo Product Pricesy Stock Statusdebe establecerse en Update on Save.

Ahora considere cómo funciona la indexación desde un punto de vista técnico. El módulo principal es responsable de la indexación Mage_Index. Los modelos básicos del indexador: Indexer, Process, Event.

Mage_Index_Model_Indexeres el indexador, todas las interacciones con otros módulos del módulo Mage_Indexocurren a través de este servicio Contiene los siguientes métodos:

  • processEntityAction() Crea y registra el evento e inicia el proceso de indexación.
  • logEvent() Crea un evento y lo registra para su posterior indexación;
  • indexEvent() Ejecuta los eventos de indexación;
  • getProcessesCollection()Devuelve la colección de todos los procesos, tales como Atributos del producto, Precios del producto, Reescrituras de URL del catálogo, etc. Por lo general, después de cambiar la esencia, como el método _afterSaveo _afterCommitsi realizamos una reindexación parcial.

El Mage_Index_Model_Processproceso o es la esencia de su indexador que almacena el estado, la última operación de ejecución. Todos los procesos se almacenan en la tabla index_process. El programa tiene un método getIndexer()que devuelve el índice del modelo. La mayoría de las tareas delegadas por el proceso del modelo de índice.

Mage_Index_Model_Eventalmacena información sobre el evento que ocurrió. Por ejemplo, almacenamos el producto y, después de guardarlo, creamos un nuevo evento y almacenamos información sobre qué tipo de entidad acabamos de guardar qué identificación tiene el espíritu y qué acción realizamos para esta sustancia.

Una lista general de cuándo ocurre la invalidación:

  1. catálogo / producto (GUARDAR, BORRAR, MASS_ACTION)
  2. catálogo / categoría (GUARDAR, BORRAR)
  3. catalog / resource_eav_attribute (GUARDAR, ELIMINAR)
  4. cliente / grupo (GUARDAR)
  5. cataloginventory / stock_item (SAVE)
  6. etiqueta / etiqueta (GUARDAR)
  7. núcleo / tienda (GUARDAR, BORRAR)
  8. core / store_group (GUARDAR, BORRAR)
  9. núcleo / sitio web (GUARDAR, BORRAR)

Cualquier modelo de recurso con índice registrado en el módulo config.xml, al guardar la transacción. afterCommitCallback()se llama con un prefijo Aquí es donde se registran los eventos de índice, ya que es al final de una transacción exitosa.

... y me entristece que EAV todavía esté presente en Magento 2. :(

Referencias


1
merch.docs.magento.com/ee/user_guide/system-operations/… Vea "Eventos que desencadenan la reindexación"
B00MER
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.