Primero de todo lo que sé:
La gestión de índices es útil para aumentar el rendimiento de la tienda.
EAV
tiene una desventaja: almacenará datos en diferentes tablas, por lo que recuperar datos lleva mucho tiempo.
De modo que almacenaremos datos en una sola tabla. Cuando se cambian los datos, actualizaremos esta tabla única (nada más que la actualización de indexación)
mysql trigger
: realiza algunas acciones de consulta basadas en la inserción / actualización / eliminación de una tabla.
Por lo tanto, magento usa el disparador, por ejemplo, cuando el precio se actualiza, se almacenará entity_id
en la tabla de registro de cambios.
hay una declaración en devdocs para implementar los desencadenadores usando magento2 Magento/Framework/Mview
.
¿Alguien puede explicar el flujo de esta funcionalidad?
Me refiero a lo que es view
, action
, processor
etc?
Mview
refiere a vistas materializadas , que son las tablas de índice.Respuestas:
En la documentación oficial: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/indexing.html está el stement:
MView significa Vista materializada, que es una instantánea de la base de datos en un momento determinado. https://en.wikipedia.org/wiki/Materialized_view ¿Por qué necesitaríamos duplicar tablas? Los indexadores son costosos de ejecutar, especialmente cuando hay tráfico en las páginas de categorías, los clientes hacen pedidos y los administradores guardan productos. Al guardar el producto, el caché se invalida (fuera del tema). En el caso del indexador de existencias, antes de que finalice la ejecución, envía los identificadores de entidad afectados como etiquetas de caché para su limpieza (tipo de caché de página completa). En las categorías de Magento 2.0 se envían los identificadores de los productos comprados. En Magento 2.1 se envían los identificadores de producto.
Hay 2 tablas MySQL que mantienen códigos y estados del indexador:
indexer_state
mview_state
mview_state
funciona conUpdate by Schedule
Admin> Sistema> Gestión de indexadorUpdate by Schedule
hace que los indexadores se ejecuten en cron.Hay 3 entradas en
Magento_Indexer/etc/contab.xml
:indexer_reindex_all_invalid
se ejecuta enindexer_state
. Todavía existe la necesidad de ejecutar indexadores 'normales' en cronindexer_update_all_views
se ejecuta enmview_state
indexer_clean_all_changelogs
- borra los registros de cambios utilizados pormview_state
Tenga en cuenta que las tareas de grupo cron indexador ejecutan en un proceso separado php, como se declara en
etc/contab_groups.xml
:<use_separate_process>1</use_separate_process>
.Las tablas de registro de cambios son:
[indexer name]_cl
(con el sufijo_cl
). por ejcataloginventory_stock_cl
. Si tiene indexadores configuradosUpdate by Schedule
y guardan un producto en admin, verá elentity_id
producto de ese producto en esta tabla. Es un gran círculo, estoy pensando que hacer un pedido o crear un envío también agregará aquí una entrada.Alguien proporcionó un ejemplo en devdoc oficial sobre cómo crear nuevas vistas materializadas y cuáles son los métodos de interfaz requeridos (ignore la declaración anterior sobre los pedidos en el siguiente fragmento):
Esto tendrá sentido: el parámetro
//public function execute($ids); Used by mview, allows you to process multiple **entities** in the "Update on schedule" mode }
Where$ids
tiene los identificadores de las entidades de las*_cl
tablas.¿Cuál es el vínculo entre la invalidación de caché y los indexadores? Las páginas de categorías ahora están en caché de página completa (caché de página completa incorporada o a través de Varnish).
Hay
\Magento\Indexer\Model\Processor\InvalidateCache::afterUpdateMview
:Volver a
Magento\Indexer\Cron\UpdateMview::execute()
:Magento\Indexer\Model\Processor::updateMview()
:En
app/etc/di.xml
hay:Magento\Framework\Mview\ViewInterface
app/etc/di.xml
En
Magento\Framework\Mview\View::update()
hay:Si busca en el
vendor/
directorioMagento\Framework\Mview\ActionInterface
encontrará, por ejemplo, esto:En
\Magento\CatalogInventory\Model\Indexer
:En esta clase hay:
Y parece que vuelve al método 'ejecutar' de la clase 'normal' de indexadores que utiliza MView.
Acerca de la limpieza de caché después de Stock Indexer. Cuando se realiza un pedido en la caja, las cantidades se restan utilizando este observador:
\Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver
Además, otro observador activa el indexador (pero no directamente en Mview / Indexer por Schedule):
\Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver
En el caso de Mview, cuando se restan las nuevas cantidades
SubtractQuoteInventoryObserver
, el activador MySQL (creado para Mview) insertará una filacataloginventory_stock_cl
, lo que indica que se debe reindexar (stock y texto completo) a los identificadores de los productos comprados. Hay muchos desencadenadores MySQL creados para Mview. Véalos a todos conSHOW TRIGGERS;
.Cuando un producto se agota después del pago, verá 2 filas insertadas en esa tabla (Magento ahorra 2 veces el artículo de stock en estos 2 observadores).
Cuando cron ejecuta el indexador de stock en modo Mview, los identificadores de producto afectados (en M2.1) o los identificadores de categoría (en M2.0) se envían a la limpieza de caché como etiquetas de caché. Por caché me refiero al tipo de caché de página completa. Ejemplo:
catalog_product_99
u otro formato de etiqueta de caché según la versión de Magento. Lo mismo cuando Mview no está habilitado.\Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction::_reindexRows
Y Magento_PageCache tiene un observador
\Magento\PageCache\Observer\FlushCacheByTags
que limpiará el tipo de caché de página completa por etiquetas. Lo hace para la memoria caché de página completa incorporada. El código relacionado con el barniz está en\Magento\CacheInvalidate\Observer\InvalidateVarnishObserver
.Existe una extensión gratuita que negará la limpieza de la memoria caché en los productos que todavía están en existencia después de la salida del cliente:
https://github.com/daniel-ifrim/innovo-cache-improve
Limpieza de caché solo en productos agotados después de que se introdujo el pago en Magento 2.2.x. Ver
\Magento\CatalogInventory\Model\Indexer\Stock\CacheCleaner
.Estoy pensando que la ejecución cron para indexador
Admin > Stores > Configuration > Advanced > System > Cron configuration options for group: index
debería establecerse en mucho más de 1 minuto.fuente
El
mview.xml
se utiliza junto con laindexer.xml
configuración de indexadores.El
mview.xml
archivo declara:El
indexer.xml
archivo declara:Puede encontrar más información sobre la declaración del indexador personalizado aquí: indexador personalizado en Magento2
Por lo que entendí, hay dos cosas diferentes aquí:
Magento_Indexer
móduloMagento\Framework\Mview
cual emula la vista materializada para MySQL usando disparadores.Aquí hay información ilustrada de la documentación oficial.
Tipos de indexación
Con respecto al flujo de trabajo, aquí está para la reindexación parcial:
fuente
La referencia del documento de Magento ya está aquí, así que me estoy saltando esa parte.
Magento implementó la vista materializada en 2.0 que rastrea los cambios para todos los indexadores. Cada indexador tiene una
_cl
tabla que obtieneentity_id
y unauto_increment
version_id
desencadenante agregado en las tablas principales.Cuando se ejecuta el trabajo cron, el indexador obtiene el último
version_id
para cada vista de lamview_state
tabla e indexa las siguientes entidades disponibles en la_cl
tabla.Reindexar fue un dolor de cabeza hasta 1.9.xx y con un gran catálogo siempre desaceleró el sistema.
En el indexador de Magento 2.0 solo actualice la información de la entidad particular en las tablas del indexador en lugar de reindexar datos completos. Esto mantiene la bola rodando sin ralentizar el servidor.
Nota: La vista materializada no es compatible con mysql, por lo tanto, en Magento, está administrada por código PHP y funciona de manera similar a la vista materializada, que es una característica en DBMS de nivel empresarial como Oracle.
fuente