A indexação do Magento é apenas semelhante à indexação em nível de banco de dados em espírito. Como afirma Anton, é um processo de desnormalização para permitir uma operação mais rápida de um site. Deixe-me tentar explicar alguns dos pensamentos por trás da estrutura do banco de dados Magento e por que ela torna a indexação necessária para operar em velocidade.
Em um banco de dados MySQL mais "típico", uma tabela para armazenar produtos do catálogo seria estruturada assim:
PRODUCT:
product_id INT
sku VARCHAR
name VARCHAR
size VARCHAR
longdesc VARCHAR
shortdesc VARCHAR
... etc ...
Isso é rápido para recuperação, mas deixa um problema fundamental para um software de comércio eletrônico:o que você faz quando deseja adicionar mais atributos? E se você vender brinquedos e, em vez de uma coluna de tamanho, precisar de
age_range
? Bem, você pode adicionar outra coluna, mas deve ficar claro que em uma loja grande (pense no Walmart, por exemplo), isso resultaria em linhas 90% vazias e tentar manter novos atributos é quase impossível. Para combater esse problema, o Magento divide as tabelas em unidades menores. Não quero recriar todo o sistema EAV nesta resposta, então aceite este modelo simplificado:
PRODUCT:
product_id INT
sku VARCHAR
PRODUCT_ATTRIBUTE_VALUES
product_id INT
attribute_id INT
value MISC
PRODUCT_ATTRIBUTES
attribute_id
name
Agora é possível adicionar atributos à vontade inserindo novos valores em
product_attributes
e, em seguida, colocar registros adjacentes em product_attribute_values
. Isso é basicamente o que o Magento faz (com um pouco mais de respeito pelos tipos de dados do que mostrei aqui). Na verdade, agora não há motivo para dois produtos terem campos idênticos, então podemos criar tipos de produto inteiros com diferentes conjuntos de atributos! No entanto, essa flexibilidade tem um custo. Se eu quiser encontrar a
color
de uma camisa no meu sistema (um exemplo trivial), preciso encontrar:- O
product_id
do item (na tabela de produtos) - O
attribute_id
paracolor
(na tabela de atributos) - Finalmente, o
value
real (na tabela attribute_values)
Magento costumava funcionar assim, mas era muito lento. Então, para permitir um melhor desempenho, eles fizeram um compromisso:uma vez que o dono da loja tenha definido os atributos que deseja, vá em frente e gere a grande tabela desde o início. Quando algo muda, nuke-o do espaço e gere-o novamente. Dessa forma, os dados são armazenados principalmente em nosso formato flexível e agradável, mas consultados em uma única tabela.
Essas tabelas de pesquisa resultantes são os "índices" do Magento. Ao reindexar, você está explodindo a tabela antiga e gerando-a novamente.
Espero que esclareça um pouco as coisas!
Obrigado, José