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/locks
que 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 table
o 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 Manual
y configurar procesos alternativos para reconstruir el índice en las horas de menor actividad (cuando los administradores están ausentes). Solo Product Prices
y Stock Status
debe 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_Indexer
es el indexador, todas las interacciones con otros módulos del módulo Mage_Index
ocurren 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 _afterSave
o _afterCommit
si realizamos una reindexación parcial.
El Mage_Index_Model_Process
proceso 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_Event
almacena 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:
- catálogo / producto (GUARDAR, BORRAR, MASS_ACTION)
- catálogo / categoría (GUARDAR, BORRAR)
- catalog / resource_eav_attribute (GUARDAR, ELIMINAR)
- cliente / grupo (GUARDAR)
- cataloginventory / stock_item (SAVE)
- etiqueta / etiqueta (GUARDAR)
- núcleo / tienda (GUARDAR, BORRAR)
- core / store_group (GUARDAR, BORRAR)
- 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