sql >> Database >  >> RDS >> Mysql

Kan iemand de Magentos Indexing-functie in detail uitleggen?

De indexering van Magento is in de geest alleen vergelijkbaar met indexering op databaseniveau. Zoals Anton stelt, is het een proces van denormalisatie om een ​​snellere werking van een site mogelijk te maken. Laat me proberen enkele van de gedachten achter de Magento-databasestructuur uit te leggen en waarom het indexeren noodzakelijk maakt om snel te werken.

In een meer "typische" MySQL-database zou een tabel voor het opslaan van catalogusproducten ongeveer als volgt gestructureerd zijn:

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

Dit is snel op te halen, maar het laat een fundamenteel probleem achter voor een stuk eCommerce-software:wat doe je als je meer attributen wilt toevoegen? Wat als je speelgoed verkoopt, en in plaats van een maatkolom, heb je age_range nodig? ? Nou, je zou nog een kolom kunnen toevoegen, maar het moet duidelijk zijn dat in een grote winkel (denk aan Walmart bijvoorbeeld), dit zou resulteren in rijen die voor 90% leeg zijn en het proberen om nieuwe attributen te onderhouden is bijna onmogelijk.

Om dit probleem tegen te gaan, splitst Magento tabellen op in kleinere eenheden. Ik wil niet het hele EAV-systeem opnieuw maken in dit antwoord, dus accepteer dit vereenvoudigde model:

PRODUCT:
    product_id INT
    sku        VARCHAR

PRODUCT_ATTRIBUTE_VALUES
    product_id   INT
    attribute_id INT
    value        MISC

PRODUCT_ATTRIBUTES
    attribute_id
    name

Het is nu mogelijk om attributen naar believen toe te voegen door nieuwe waarden in te voeren in product_attributes en vervolgens aangrenzende records in product_attribute_values . plaatsen . Dit is eigenlijk wat Magento doet (met een beetje meer respect voor datatypes dan ik hier heb weergegeven). In feite is er nu geen reden meer voor twee producten om identieke velden te hebben, dus we kunnen hele producttypes maken met verschillende sets attributen!

Aan deze flexibiliteit hangt echter een prijskaartje. Als ik de color wil vinden van een shirt in mijn systeem (een triviaal voorbeeld), moet ik het volgende vinden:

  1. De product_id van het artikel (in de producttabel)
  2. De attribute_id voor color (in de attributentabel)
  3. Eindelijk, de werkelijke value (in de tabel attribute_values)

Magento werkte vroeger zo, maar het was doodstil. Dus om betere prestaties mogelijk te maken, hebben ze een compromis gesloten:zodra de winkeleigenaar de gewenste kenmerken heeft gedefinieerd, ga je gang en genereer je de grote tafel vanaf het begin. Als er iets verandert, vernietig het dan vanuit de ruimte en genereer het opnieuw. Op die manier worden gegevens voornamelijk opgeslagen in ons mooie flexibele formaat, maar opgevraagd vanuit een enkele tabel.

Deze resulterende opzoektabellen zijn de Magento "indexen". Wanneer u opnieuw indexeert, blaast u de oude tabel op en genereert u deze opnieuw.

Ik hoop dat dat de zaken een beetje verduidelijkt!

Bedankt, Joe



  1. Zijn PL/SQL-variabelen in cursors in feite hetzelfde als bindparameters?

  2. mysqli_num_rows werkt niet correct

  3. Natuurlijk meedoen in SQL Server

  4. Invoegen in selecteren en bijwerken in enkele query