EAV税:Magentoの製品ロードが遅い理由
Magentoユーザーは、しばしば速度について不満を漏らします。その多くは、知らず知らずのうちに「EAV税」を支払っています。
Magentoにおける製品は、単一の行ではありません。それは多くのテーブルに分散した行の集合体です。あるテーブルは静的なカラムを保持し、他のテーブルはvarchar、int、decimal、text、datetimeといった特定のデータ型を保持しています。
1つの製品をロードするために、Magentoはこれらのすべてのテーブルからデータを読み取ります。その後、それらを再び1つのオブジェクトへと繋ぎ合わせます。ストアビューを追加すると、その作業量は2倍になります。
最大の罠は、addAttributeToSelect('*') を使用することです。
アスタリスク(*)は、すべての属性をロードすることを意味します。もしカテゴリページに36個の製品が表示されている場合、必要なのは名前や価格といった6つのフィールドだけかもしれません。しかし、アスタリスクを使用すると、代わりに60個ものフィールドをロードすることになります。Magentoは、結局捨ててしまうことになる54個もの余分なフィールドを読み込み、結合し、処理しているのです。
これは5分で修正できます。
アスタリスクの使用をやめましょう。必要なカラムを正確にリストアップしてください:
- name
- price
- small_image
- url_key
- status
- visibility
この変更は、表示の遅いリスティングページにとって最大の改善策となります。
より根本的な解決策としては、リスティングページでEAVから製品を再構成しないことです。カテゴリページや検索では、インデックステーブルやOpenSearchから読み取るべきです。Magentoはこれらのインデックスを自動的に維持しています。高速なカテゴリページは、これらのインデックスを活用し、テンプレートが表示するわずかな属性に対してのみEAVにアクセスします。
flat catalog機能は使用しないでください。属性が多い場合に失敗するため、Adobeによって非推奨となりました。これはインデックス作成の負荷を増大させ、MySQLのカラム制限に抵触します。
パフォーマンス向上のために、以下のルールに従ってください:
- 名前を指定した属性のみを選択してください。ユーザーに表示されるコレクションでアスタリスクを使用してはいけません。
- リスティングやフィルタリングにはOpenSearchを使用してください。
- 一括エクスポートには、
entity_idによる keyset pagination を使用してください。 - エクスポートに必要なフィールドのみを選択してください。
結果を測定しましょう。クエリログを有効にします。もし1つのカテゴリページで数百ものクエリが発行されているなら、原因はEAVの再構成です。これで、問題を引き起こしているコードの行を見つける方法が分かりました。
Source: https://dev.to/iamrobindhiman/the-eav-tax-why-magento-product-loads-are-slow-117h
