Quando os índices são invalidados?

23

Eu tenho uma loja e o tempo todo TODOS os índices são inválidos. Percebi que não tenho idéia quando um índice é invalidado.

Você pode me dar uma lista de "todos" eventos, que tornam um ou mais desses índices inválidos?

  • Atributos do produto
  • Preços dos produtos
  • Regravações de URL do catálogo
  • Dados planos do produto
  • Categoria Produtos
  • Índice de Pesquisa de Catálogo
  • Dados de agregação de tags
  • Status de estoque
Fabian Blechschmidt
fonte

Respostas:

18

Ao executar um grep no diretório de código, você obterá uma lista de arquivos que acionam uma invalidação. grep -Ri '::STATUS_REQUIRE_REINDEX' .

Os seguintes arquivos principais acionam uma invalidação

./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

Eventos básicos no núcleo Magento CE são

Atributos do produto

atributo de salvamento específico (faz parte do produto plano), store, store_group se o produto do catálogo plano estiver ativado

Preços dos produtos

verificar as configurações salvas (como o escopo do preço). ou salvar produto, o site cria / exclui

Regravações de URL do catálogo

nenhuma invalidação específica

Dados planos do produto

Atributo de salvamento específico (faz parte do produto plano), se o produto do catálogo plano estiver ativado, Depois de ativar o produto plano

Categoria Dados Simples

A seleção é categoria de catálogo simples está ativada e a categoria de salvamento específica, depois de ativar a categoria plana

Categoria Produtos

verifique se a categoria do catálogo está ativada e a categoria específica para salvar

Índice de Pesquisa de Catálogo

atributo de salvamento específico (faz parte dos atributos pesquisáveis), store, store_group se o produto de catálogo simples estiver ativado

Dados de agregação de tags

Nunca invalidado, exceto as condições gerais mencionadas abaixo

Status de estoque

Sistema específico> Configurações na guia Inventário, salve, mostre produtos fora de estoque, por exemplo

Todos eles são invalidados após uma reversão no backup System > Tools > Backupe criação, exclusão ou movimentação de sites, lojas e visualizações de loja Após executar importações de fluxo de dados para o produto, o seguinte é invalidado: catalog_product_price, catalog_category_product, catalogsearch_fulltext, catalog_product_flat

Vários indexadores, como dados simples e o indexador de URL, também parecem ser invalidados ao salvar core_config_datavalores.

Sander Mangel
fonte
14

Talvez seja uma ideia criar temporariamente uma reescrita para este site em

Mage_Index_Model_Resource_Process

Então faça 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);
    }

}

Isso deve identificar facilmente quando um indexador é invalidado e o rastreamento de chamada que foi responsável por ele.

Daniel Sloof
fonte
10

Já que outros já responderam às suas perguntas específicas. Eu pensei que seria melhor explicar por que a indexação é necessária e como ela se relaciona com o Magento e o relacionamento com os bancos de dados modernos .

Índice: uma lista alfabética de nomes, assuntos, etc., com referências aos locais onde ocorrem, normalmente encontradas no final de um livro.

Então, o que exatamente é um índice em termos de bancos de dados ?

Um índice é uma estrutura de dados que classifica vários registros em um ou mais campos e acelera a recuperação de dados. Isso evita a varredura pelos blocos de disco que uma tabela abrange, ao pesquisar no banco de dados.

E o que é Indexação em termos de Magento ? O subproduto do EAV (Entity Attribute Value) AKA é um banco de dados dentro de um banco de dados. Com várias tabelas de pesquisa, reunir todos os atributos sinalizados como indexados para serem combinados em uma tabela plana de todas as tabelas de pesquisa, para consultas mais rápidas e menos ciclos de E / S e CPU.

Lembro-me de uma menção de que, quando o Magento estava sendo desenvolvido inicialmente, a flexibilidade era alta na lista de prioridades, o que é compreensível por que eles escolheram seguir o modelo de dados EAV. No entanto, no final das contas, o custo dessa flexibilidade custou o desempenho e afetou o Magento desde o início.

Em geral, os Magento Engineers foram encarregados, em primeiro lugar, de criar o sistema mais flexível e personalizável possível e se preocupar com o desempenho posteriormente. Por que o Magento é tão lento?

O EAV é ótimo para data warehousing, mas terrível para transacional. Então, por que precisamos de índices para começar? Como a mesma abordagem do modelo relacional foi reimplementada, o Magento agora tem que lidar com todas as coisas que o MySQL faz internamente. Algumas coisas a considerar, como índices já existentes nas tabelas MySQL. Com isso em mente também, considere o modelo de dados EAV agora:

  • E ntity = Tabela
  • Um atributo = Campo
  • V alor = Valor

O mesmo deve ser reimplementado, o que é muito IMO "antipadrão".

Além disso, esse é o mesmo motivo pelo var/locksqual o indexador usa para bloquear o processo de indexação. Mesmas razões pelas quais os bancos de dados têm bloqueio de linha / tabela.

Agora, quando um registro, digamos que um valor do produto foi alterado, flat tableou index(como o MySQL se referiria a ele) precisa ser atualizado para refletir as consultas sobre os dados recém-alterados, que podem ser encontrados de maneira rápida e eficiente, sem varrer vários registros. As tabelas simples existem como usadas na mesma razão que o MySQL as possui, sem esse índice (como um livro), é necessária uma varredura completa da tabela para recuperar o registro. Isso significa grandes quantidades de E / S para disco e memória, bem como ciclos de CPU para localizar os dados solicitados, o que é muito ruim para o desempenho.

Como o Magento usa o modelo de dados EAV, existem inúmeras tabelas de pesquisa que precisam ser varridas para reunir todos os dados para localizar os dados solicitados. É o que acontece se você desabilitar os catálogos Flat. Assim como o MySQL, varrendo o registro versus usando um índice (tabela plana) a ser utilizado para localizar o registro rapidamente, preservando os preciosos ciclos de E / S. Criar uma tabela e não adicionar índices é o mesmo que não usar as tabelas simples no magento. Embora esses dois cenários possam funcionar bem em diferentes cenários, veja Ben na resposta muito boa de Sonassi a esta pergunta. (Dica: envolve a compreensão do escopo dos dados.)

Embora não seja uma resposta direta à sua pergunta, entender as partes móveis e estar melhor preparado para elas deve ajudar a aliviar algumas das dores de cabeça que acompanham a indexação. " Trate o problema e não o sintoma. "

Explorar mais o interior dos sistemas modernos de banco de dados pode ajudar a entender melhor como e por que a indexação é necessária e como ela se relaciona (um pouco) à indexação do Magento também.

Para resumir: Entenda o escopo do seu problema antes de aplicar cegamente as soluções. Como nem todos os dados serão exatamente iguais e o planejamento e a implementação de soluções APÓS a compreensão do problema. A otimização do banco de dados pode ser muito gratificante para o gerenciamento de alterações. Como prevenir o temido DEADLOCKS.

Você também pode considerar definir todos os seus indexadores Manuale configurar processos alternativos para reconstruir o índice fora do horário de pico (quando os administradores estão ausentes). Somente Product Pricese Stock Statusdeve ser definido como Update on Save.

Agora, considere como a indexação funciona do ponto de vista técnico. O módulo principal é responsável pela indexação Mage_Index. Modelos básicos do indexador: Indexer, Process, Event.

Mage_Index_Model_Indexeré o indexador, todas as interações com outros módulos Mage_Indexocorrem através desse serviço. Ele contém os seguintes métodos:

  • processEntityAction() Cria e registra o evento e inicia o processo de indexação
  • logEvent() Cria um evento e registra-o para indexação subsequente;
  • indexEvent() Executa os eventos de indexação;
  • getProcessesCollection()Retorna a coleção de todos os processos, como Atributos do produto, Preços do produto, Regravações de URL do catálogo, etc. Geralmente, depois de alterar a essência, como o método, _afterSaveou _afterCommitrealizamos um re-índice parcial.

O Mage_Index_Model_Processprocesso ou é a essência do seu indexador que armazena o status, a última operação executada. Todos os processos são armazenados na tabela index_process. O programa possui um método getIndexer()que retorna o índice do modelo. A maioria das tarefas delegadas pelo processo do modelo de índice.

Mage_Index_Model_Eventarmazena informações sobre o evento que ocorreu. Por exemplo, armazenamos o produto e, após salvar, criamos um novo evento e armazenamos informações sobre que tipo de entidade acabamos de salvar que id tem o espírito e que ação executamos para essa substância.

Uma lista geral de quando ocorre a invalidação:

  1. catálogo / produto (SAVE, DELETE, MASS_ACTION)
  2. catálogo / categoria (SAVE, DELETE)
  3. catalog / resource_eav_attribute (SAVE, DELETE)
  4. cliente / grupo (SAVE)
  5. cataloginventory / stock_item (SAVE)
  6. tag / tag (SALVAR)
  7. núcleo / loja (SALVAR, EXCLUIR)
  8. core / store_group (SALVAR, EXCLUIR)
  9. núcleo / site (SALVAR, EXCLUIR)

Qualquer modelo de recurso com índice registrado no módulo config.xml, ao salvar a transação. afterCommitCallback()é chamado com um prefixo. É aqui que os eventos do índice são registrados, pois estão no final de uma transação bem-sucedida.

... e me entristece que o EAV ainda esteja presente no Magento 2. :(

Referências:

B00MER
fonte
1
merch.docs.magento.com/ee/user_guide/system-operations/… Consulte "Eventos que desencadeiam a reindexação"
B00MER 16/15/15