Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Kann jemand die Indexierungsfunktion von Magentos im Detail erklären?

Die Indizierung von Magento ähnelt nur im Geiste der Indizierung auf Datenbankebene. Wie Anton feststellt, handelt es sich um einen Prozess der Denormalisierung, um einen schnelleren Betrieb einer Website zu ermöglichen. Lassen Sie mich versuchen, einige der Gedanken hinter der Magento-Datenbankstruktur zu erklären und warum sie eine Indexierung für einen schnellen Betrieb erforderlich macht.

In einer "typischeren" MySQL-Datenbank würde eine Tabelle zum Speichern von Katalogprodukten etwa so aufgebaut sein:

PRODUCT:
    product_id INT
    sku        VARCHAR
    name       VARCHAR
    size       VARCHAR
    longdesc   VARCHAR
    shortdesc  VARCHAR
    ... etc ...

Das lässt sich schnell abrufen, hinterlässt jedoch ein grundlegendes Problem für eine E-Commerce-Software:Was tun Sie, wenn Sie weitere Attribute hinzufügen möchten? Was ist, wenn Sie Spielzeug verkaufen und anstelle einer Größenspalte age_range benötigen ? Nun, Sie könnten eine weitere Spalte hinzufügen, aber es sollte klar sein, dass dies in einem großen Geschäft (denken Sie zum Beispiel an Walmart) zu Zeilen führen würde, die zu 90 % leer sind, und der Versuch, neue Attribute beizubehalten, ist nahezu unmöglich.

Um diesem Problem entgegenzuwirken, teilt Magento Tabellen in kleinere Einheiten auf. Ich möchte in dieser Antwort nicht das gesamte EAV-System neu erstellen, also akzeptieren Sie bitte dieses vereinfachte Modell:

PRODUCT:
    product_id INT
    sku        VARCHAR

PRODUCT_ATTRIBUTE_VALUES
    product_id   INT
    attribute_id INT
    value        MISC

PRODUCT_ATTRIBUTES
    attribute_id
    name

Jetzt ist es möglich, Attribute nach Belieben hinzuzufügen, indem Sie neue Werte in product_attributes eingeben und dann angrenzende Datensätze in product_attribute_values einfügen . Dies ist im Grunde das, was Magento tut (mit etwas mehr Respekt für Datentypen, als ich hier gezeigt habe). Tatsächlich gibt es jetzt überhaupt keinen Grund mehr, dass zwei Produkte identische Felder haben, sodass wir ganze Produkttypen erstellen können mit unterschiedlichen Attributen!

Diese Flexibilität hat jedoch ihren Preis. Wenn ich die color finden möchte eines Hemdes in meinem System (ein triviales Beispiel), muss ich Folgendes finden:

  1. Die product_id des Artikels (in der Produkttabelle)
  2. Die attribute_id für color (in der Attributtabelle)
  3. Schließlich der eigentliche value (in der attribute_values-Tabelle)

Früher hat Magento so funktioniert, aber es war verdammt langsam. Um eine bessere Leistung zu ermöglichen, sind sie also einen Kompromiss eingegangen:Sobald der Shop-Besitzer die gewünschten Attribute definiert hat, können Sie die große Tabelle von Anfang an generieren. Wenn sich etwas ändert, atomisieren Sie es aus dem Weltraum und erzeugen Sie es erneut. Auf diese Weise werden Daten hauptsächlich in unserem netten flexiblen Format gespeichert, aber aus einer einzigen Tabelle abgefragt.

Diese resultierenden Nachschlagetabellen sind die Magento-"Indizes". Wenn Sie neu indizieren, sprengen Sie die alte Tabelle und erzeugen sie erneut.

Hoffe, das klärt die Dinge ein wenig!

Danke, Joe