sql >> データベース >  >> RDS >> Mysql

誰かがMagentosインデックス機能を詳細に説明できますか?

    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を見つけたい場合 私のシステムのシャツの場合(簡単な例)、次のものを見つける必要があります:

    1. product_id アイテムの(製品テーブル内)
    2. attribute_id colorの場合 (属性テーブル内)
    3. 最後に、実際のvalue (attribute_valuesテーブル内)

    Magentoは以前はこのように機能していましたが、非常に低速でした。そこで、パフォーマンスを向上させるために、妥協しました。ショップの所有者が必要な属性を定義したら、最初から大きなテーブルを生成します。何かが変わったら、それを宇宙から核兵器にして、もう一度生成します。このように、データは主に柔軟な形式で保存されますが、単一のテーブルからクエリされます。

    これらの結果のルックアップテーブルは、Magentoの「インデックス」です。インデックスを再作成すると、古いテーブルが爆破され、再度生成されます。

    それが物事を少し明確にすることを願っています!

    ありがとう、ジョー



    1. php / sqlを使用してmysqlデータへの入力を比較するにはどうすればよいですか?

    2. mysqlのエイリアスでのフィルタリング

    3. SQLServer診断を実行するための4つのヒント

    4. EFコア-テーブル'*.__EFMigrationsHistory'は存在しません