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/locks
qual 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 table
ou 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 Manual
e configurar processos alternativos para reconstruir o índice fora do horário de pico (quando os administradores estão ausentes). Somente Product Prices
e Stock Status
deve 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_Index
ocorrem 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, _afterSave
ou _afterCommit
realizamos um re-índice parcial.
O Mage_Index_Model_Process
processo 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_Event
armazena 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:
- catálogo / produto (SAVE, DELETE, MASS_ACTION)
- catálogo / categoria (SAVE, DELETE)
- catalog / resource_eav_attribute (SAVE, DELETE)
- cliente / grupo (SAVE)
- cataloginventory / stock_item (SAVE)
- tag / tag (SALVAR)
- núcleo / loja (SALVAR, EXCLUIR)
- core / store_group (SALVAR, EXCLUIR)
- 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: