Primeiro de tudo o que eu sei:
O gerenciamento de índice é útil para aumentar o desempenho da loja.
EAV
tem uma desvantagem. ele armazenará dados em tabelas diferentes. para que a recuperação de dados consuma tempo.
Para que possamos armazenar dados em uma única tabela. quando os dados forem alterados, atualizaremos esta tabela única (nada além de atualização de indexação)
mysql trigger
: execute algumas ações de consulta com base em alguma inserção / atualização / exclusão de tabela.
Então, o magento usando trigger, por exemplo, quando o preço está atualizando, será armazenado entity_id
na tabela de registros de alterações.
existe uma declaração no devdocs para implementar gatilhos usando o magento2 Magento/Framework/Mview
.
você pode explicar o fluxo dessa funcionalidade?
eu quero dizer o que é view
, action
, processor
etc?
Mview
refere-se a visualizações materializadas , que são as tabelas de índice.Respostas:
Na documentação oficial: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/indexing.html , está o seguinte:
MView significa Materialized View, que é um instantâneo do banco de dados em um determinado momento. https://en.wikipedia.org/wiki/Materialized_view Por que precisamos duplicar tabelas. Os indexadores são caros para executar, especialmente quando há tráfego nas páginas de categorias, os clientes fazem pedidos e os administradores salvam produtos. No produto salvo, o cache é invalidado (fora do tópico). No caso do indexador de ações, antes de finalizar a execução, ele envia os IDs da entidade afetados como tags de cache a serem limpos (tipo de cache de página inteira). Nas categorias Magento 2.0, os IDs dos produtos comprados são enviados. No Magento 2.1, os IDs do produto são enviados.
Existem 2 tabelas MySQL que mantêm códigos e status do indexador:
indexer_state
mview_state
mview_state
trabalha comUpdate by Schedule
em Admin> Sistema> Gerenciamento do IndexadorUpdate by Schedule
faz com que os indexadores sejam executados no cron.Existem 3 entradas em
Magento_Indexer/etc/contab.xml
:indexer_reindex_all_invalid
é executadoindexer_state
. Ainda há a necessidade de executar indexadores 'normais' no cronindexer_update_all_views
é executado emmview_state
indexer_clean_all_changelogs
- limpa os registros de alterações usados pormview_state
Note-se que as tarefas de grupo cron indexador executado em um processo php separado, conforme declarado em
etc/contab_groups.xml
:<use_separate_process>1</use_separate_process>
.As tabelas de alterações são:
[indexer name]_cl
(com o sufixo_cl
). por exemplocataloginventory_stock_cl
. Se você tiver indexadores definidos paraUpdate by Schedule
e salvar um produto no administrador, verá oentity_id
produto nessa tabela. É um grande círculo, estou pensando que fazer um pedido ou criar uma remessa também adicionará uma entrada aqui.Alguém forneceu um exemplo no devdoc oficial sobre como criar novas visualizações materializadas e quais são os métodos de interface necessários (desconsidere a declaração acima sobre pedidos no snippet abaixo):
Isso fará sentido:
//public function execute($ids); Used by mview, allows you to process multiple **entities** in the "Update on schedule" mode }
Onde o$ids
parâmetro possui os IDs de entidades das*_cl
tabelas.Qual é o link entre a invalidação de cache e os indexadores. As páginas de categorias agora estão em cache de página inteira (cache de página inteira interno ou através do Varnish).
Existe
\Magento\Indexer\Model\Processor\InvalidateCache::afterUpdateMview
:Voltar para
Magento\Indexer\Cron\UpdateMview::execute()
:Magento\Indexer\Model\Processor::updateMview()
:Em
app/etc/di.xml
existe:Magento\Framework\Mview\ViewInterface
app/etc/di.xml
Em
Magento\Framework\Mview\View::update()
existe:Se você pesquisar no
vendor/
diretório,Magento\Framework\Mview\ActionInterface
encontrará, por exemplo, o seguinte:Em
\Magento\CatalogInventory\Model\Indexer
:Nesta classe há:
E parece que ele volta à classe 'normal' de indexadores 'execute` método que é usado pelo MView.
Sobre a limpeza do cache após o Stock Indexer. Quando um pedido é feito no check-out, as quantidades são subtraídas usando este observador:
\Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver
Além disso, outro observador aciona o indexador (mas não diretamente no Mview / Indexer por Schedule):
\Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver
No caso do Mview, quando as novas quantidades forem subtraídas
SubtractQuoteInventoryObserver
, o gatilho MySQL (criado para o Mview) inserirá uma linhacataloginventory_stock_cl
, marcando que uma reindexação (estoque e texto completo) precisa ser feita com os IDs de produtos adquiridos. Existem muitos gatilhos MySQL criados para o Mview. Veja todos eles comSHOW TRIGGERS;
.Quando um produto fica fora de estoque após o checkout, você vê 2 linhas inseridas nessa tabela (o Magento economiza 2 vezes o item em estoque nesses 2 observadores).
Quando o cron executa o indexador de ações no modo Mview, os IDs de produtos afetados (em M2.1) ou de categorias (em M2.0) são enviados para o cache limpo como tags de cache. Por cache, quero dizer o tipo de cache de página inteira. Exemplo:
catalog_product_99
ou outro formato de tag de cache, dependendo da versão do Magento. O mesmo quando o Mview não está ativado.\Magento\CatalogInventory\Model\Indexer\Stock\AbstractAction::_reindexRows
E o Magento_PageCache possui um observador
\Magento\PageCache\Observer\FlushCacheByTags
que limpará o tipo de cache de página inteira por tags. Faz isso para armazenar em cache de página inteira. O código relacionado ao verniz está em\Magento\CacheInvalidate\Observer\InvalidateVarnishObserver
.Existe uma extensão gratuita que negará que o cache seja limpo em produtos ainda em estoque após o checkout do cliente:
https://github.com/daniel-ifrim/innovo-cache-improve
Limpeza de cache apenas em produtos fora de estoque após a introdução do checkout no Magento 2.2.x padrão. Veja
\Magento\CatalogInventory\Model\Indexer\Stock\CacheCleaner
.Eu estou pensando que a execução cron para indexador em
Admin > Stores > Configuration > Advanced > System > Cron configuration options for group: index
deve ser definida para muito mais de 1 minuto.fonte
O
mview.xml
é usado junto comindexer.xml
para configurar indexadores.O
mview.xml
arquivo declara:O
indexer.xml
arquivo declara:Você pode encontrar mais informações sobre a declaração do indexador personalizado aqui: Indexador personalizado no Magento2
Pelo que entendi, há duas coisas diferentes aqui:
Magento_Indexer
móduloMagento\Framework\Mview
qual emula a visão materializada do MySQL usando gatilhos.Aqui estão algumas informações publicadas na documentação oficial
Tipos de indexação
Em relação ao fluxo de trabalho, aqui está a reindexação parcial:
fonte
A referência do documento Magento já está aqui, então estou pulando essa parte.
O Magento implementou a visualização materializada na versão 2.0, que rastreia as alterações para todos os indexadores. Cada indexador possui uma
_cl
tabela que recebeentity_id
e umauto_increment
version_id
dos gatilhos adicionados nas tabelas principais.Quando a tarefa cron é executada, o indexador fica em último
version_id
para cada visualização damview_state
tabela e indexa as próximas entidades disponíveis na_cl
tabela.Reindexar foi uma dor de cabeça até 1.9.xx e com um catálogo enorme, sempre diminuiu a velocidade do sistema.
No indexador Magento 2.0, atualize apenas as informações da entidade específica nas tabelas do indexador, em vez de reindexar os dados inteiros. Isso mantém a bola rolando sem diminuir a velocidade do servidor.
Nota: O Materialized View não é suportado no mysql, portanto, no Magento, ele é gerenciado pelo código PHP e funciona de forma semelhante ao Materialized view, que é um recurso no DBMS de nível empresarial, como o Oracle.
fonte