Magentoのインデックス作成は、精神的にはデータベースレベルのインデックス作成にのみ似ています。アントンが述べているように、それはサイトのより速い操作を可能にするための非正規化のプロセスです。 Magentoデータベース構造の背後にあるいくつかの考えと、高速で動作するためにインデックス作成が必要になる理由を説明してみましょう。
より「典型的な」MySQLデータベースでは、カタログ製品を格納するためのテーブルは次のように構成されます。
PRODUCT:
product_id INT
sku VARCHAR
name VARCHAR
size VARCHAR
longdesc VARCHAR
shortdesc VARCHAR
... etc ...
これは取得が高速ですが、eコマースソフトウェアに根本的な問題を残します。属性を追加したい場合はどうしますか?サイズの列ではなくおもちゃを販売する場合は、age_range
が必要です。 ?別の列を追加することもできますが、大規模な店舗(たとえば、ウォルマートなど)では、行が90%空になり、新しい属性を維持しようとすることはほぼ不可能であることは明らかです。
この問題に対処するために、Magentoはテーブルを小さな単位に分割します。この回答でEAVシステム全体を再作成したくないので、この簡略化されたモデルを受け入れてください:
PRODUCT:
product_id INT
sku VARCHAR
PRODUCT_ATTRIBUTE_VALUES
product_id INT
attribute_id INT
value MISC
PRODUCT_ATTRIBUTES
attribute_id
name
product_attributes
に新しい値を入力することで、属性を自由に追加できるようになりました。 次に、隣接するレコードをproduct_attribute_values
に配置します 。これは基本的にMagentoが行うことです(ここに表示したよりもデータ型を少し尊重しています)。実際、2つの商品が同じフィールドを持つ理由はまったくないため、商品タイプ全体を作成できます。 さまざまな属性のセットを使用します!
ただし、この柔軟性にはコストがかかります。 color
を見つけたい場合 私のシステムのシャツの場合(簡単な例)、次のものを見つける必要があります:
-
product_id
アイテムの(製品テーブル内) -
attribute_id
color
の場合 (属性テーブル内) - 最後に、実際の
value
(attribute_valuesテーブル内)
Magentoは以前はこのように機能していましたが、非常に低速でした。そこで、パフォーマンスを向上させるために、妥協しました。ショップの所有者が必要な属性を定義したら、最初から大きなテーブルを生成します。何かが変わったら、それを宇宙から核兵器にして、もう一度生成します。このように、データは主に柔軟な形式で保存されますが、単一のテーブルからクエリされます。
これらの結果のルックアップテーブルは、Magentoの「インデックス」です。インデックスを再作成すると、古いテーブルが爆破され、再度生成されます。
それが物事を少し明確にすることを願っています!
ありがとう、ジョー