Puisque d'autres ont déjà répondu à vos questions spécifiques. J'ai pensé qu'il serait peut-être préférable d'expliquer pourquoi l'indexation est nécessaire et comment elle se rapporte à Magento et la relation avec les bases de données modernes .
Index: une liste alphabétique des noms, des sujets, etc., avec des références aux endroits où ils se produisent, généralement à la fin d'un livre.
Alors, qu'est-ce qu'un index en termes de bases de données ?
Un index est une structure de données qui trie un certain nombre d'enregistrements sur un ou plusieurs champs et accélère la récupération des données. Cela permet d'éviter d'analyser les blocs de disque qu'une table couvre lors de la recherche dans la base de données.
Et qu'est-ce que l'indexation en termes de Magento ? Le sous-produit de EAV (Entity Attribute Value) AKA une base de données dans une base de données. Avec plusieurs tables de recherche, regroupant tous les attributs marqués comme indexés pour être combinés en une seule table plate de toutes les tables de recherche, pour des requêtes plus rapides et moins d'E / S et de cycles CPU.
Je me souviens d'une mention selon laquelle lors du développement initial de Magento, la flexibilité figurait en haut de la liste des priorités, ce qui explique pourquoi ils ont choisi d'utiliser le modèle de données EAV. En fin de compte, cependant, le coût d'une telle flexibilité a eu un impact sur les performances et cela a tourmenté Magento depuis le début.
En général, les ingénieurs de Magento ont été chargés, avant tout, de créer le système le plus flexible et personnalisable possible, et de se soucier des performances plus tard. Pourquoi Magento est-il si lent?
L'EAV est idéal pour l'entreposage de données mais terrible pour les transactions. Alors pourquoi avons-nous besoin d'index pour commencer? Depuis que la même approche du modèle relationnel a été réimplémentée, Magento doit maintenant gérer toutes les choses que MySQL fait lui-même en interne. Certaines choses à considérer, comme les index déjà existants dans les tables MySQL. Dans cet esprit également, considérons maintenant le modèle de données EAV:
- E ntité = Table
- A ttribute = Field
- V alue = valeur
Le même doit être réimplémenté, ce qui est très "anti-modèle" OMI.
En outre, c'est la même raison pour var/locks
laquelle l' indexeur utilise pour verrouiller le processus d'indexation. Mêmes raisons pour lesquelles les bases de données ont un verrouillage de ligne / table.
Désormais, lorsqu'un enregistrement, par exemple, une valeur de produit a été modifiée, le flat table
ou index
(comme MySQL l'appellerait) doit être mis à jour pour être reflété afin que les requêtes sur les données nouvellement modifiées soient trouvées rapidement et efficacement sans parcourir de nombreux enregistrements. Les tables plates existent telles qu'elles sont utilisées dans la même raison que MySQL les a, sans un tel index (comme un livre), il nécessite une analyse complète de la table pour récupérer l'enregistrement. Cela signifie des quantités massives d'E / S pour le disque et la mémoire ainsi que des cycles de processeur pour localiser les données demandées, ce qui est très mauvais pour les performances.
Étant donné que Magento utilise le modèle de données EAV, il existe de nombreuses tables de recherche qui doivent être analysées pour regrouper toutes les données afin de localiser les données qui ont été demandées. C'est ce qui se produit si vous désactivez les catalogues plats. Tout comme MySQL, l'analyse de l'enregistrement par rapport à l'utilisation d'un index (table plate) à utiliser pour localiser l'enregistrement rapidement tout en préservant les précieux cycles d'E / S. Créer une table et ne pas ajouter d'index revient à ne pas utiliser les tables plates dans magento. Bien que ces deux scénarios puissent bien fonctionner dans différents scénarios, voir Ben à la très bonne réponse de Sonassi à cette question. (Indique que cela implique de comprendre la portée des données.)
Bien que ce ne soit pas une réponse directe à votre question, comprendre les parties mobiles et être mieux préparé pour elles devrait aider à atténuer certains des maux de tête qui accompagnent l'indexation. " Traitez le problème plutôt que le symptôme. "
Explorer davantage les composants internes des systèmes de bases de données modernes peut aider à mieux comprendre comment et pourquoi l'indexation est nécessaire et comment elle se rapporte (quelque peu) à l'indexation de Magento.
Pour résumer: Comprenez l'étendue de votre problème avant d'appliquer aveuglément des solutions. Comme toutes les données ne seront pas exactement les mêmes et planifier et mettre en œuvre des solutions APRÈS avoir une bonne / complète compréhension du problème. L'optimisation de la base de données peut être très enrichissante pour la gestion du changement. Telles que prévenir les redoutés DEADLOCKS
.
Vous pouvez également envisager de définir tous vos indexeurs Manual
et de configurer des processus alternatifs pour reconstruire l'index aux heures creuses (lorsque les administrateurs sont absents). Uniquement Product Prices
et Stock Status
doit être défini sur Update on Save
.
Voyons maintenant comment fonctionne l'indexation d'un point de vue technique. Le module principal est responsable de l'indexation Mage_Index
. Les modèles de base de l'indexeur: Indexer
, Process
, Event
.
Mage_Index_Model_Indexer
est l'indexeur, toutes les interactions avec d'autres modules modules Mage_Index
se produisent via ce service. Il contient les méthodes suivantes:
processEntityAction()
Crée et enregistre l'événement et démarre le processus d'indexation
logEvent()
Crée un événement et l'enregistre pour une indexation ultérieure;
indexEvent()
Exécute les événements d'indexation;
getProcessesCollection()
Renvoie la collection de tous les processus tels que les attributs de produit, les prix des produits, les réécritures d'URL de catalogue, etc. Habituellement après avoir changé l'essence, comme la méthode _afterSave
ou _afterCommit
nous effectuons une réindexation partielle.
Le Mage_Index_Model_Process
processus or est l'essence de votre indexeur qui stocke le statut, la dernière opération exécutée. Tous les processus sont stockés dans la table index_process
. Le programme a une méthode getIndexer()
qui retourne l'index du modèle. La plupart des tâches déléguées par le processus du modèle d'index.
Mage_Index_Model_Event
stocke des informations sur l'événement qui s'est produit. Par exemple, nous stockons le produit et après avoir enregistré, nous créons un nouvel événement et stockons des informations sur le type d'entité que nous venons de sauvegarder, quel id a l'esprit et quelle action nous avons effectuée pour cette substance.
Une liste générale des cas d'invalidation:
- catalogue / produit (SAVE, DELETE, MASS_ACTION)
- catalogue / catégorie (SAVE, DELETE)
- catalog / resource_eav_attribute (SAVE, DELETE)
- client / groupe (SAVE)
- cataloginventory / stock_item (SAVE)
- tag / tag (SAVE)
- core / store (SAVE, DELETE)
- core / store_group (SAVE, DELETE)
- noyau / site Web (SAVE, DELETE)
Tout modèle de ressource avec index enregistré dans le module config.xml
, lors de l'enregistrement de la transaction. afterCommitCallback()
est appelé avec un préfixe. C'est là que les événements d'index sont enregistrés, car ils se trouvent à la fin d'une transaction réussie.
... et ça me rend triste que l'EAV soit toujours là dans Magento 2. :(
Les références: