Magento indexelés: alapok, előnyök és a hibák elkerülése

Magento indexelés jelentése

Definició 1:

 

Az indexelés az a folyamat, amikor a Magento átalakítja a termék, kategória stb. adatokat a legjobb lekérdezési sebesség elérés érdekében.

 

Definició 2:

Az adatok letárolása a MySQL adatbázis számára, hogy a legjobb indexekből álljon elő az SQL lekérdezés.

 

Mi történne, ha nem lenne indexelés a Magento-ban?

Az itt felsorolt példák mindegyike szemlélteti, hogy jelentős teljesítménybeli javulást eredményeznek a Magento indexek. Már egy termék esetén is érdemes bekapcsolni az indexelést annak ellenére, hogy egy termék esetén nem olyan számottevő a sebességnövekedés.

  1. Az árak a terméklistában betöltődési időben számolódnának a kosár ár szabályok és a felhasználó csoport alapján
  2. A raktárkészlet kiszámítása a konfigurálható és a kötegelt termékek esetén csak a termék kollekció betöltődése után valósulna meg
  3. A „layered navigation” valós időben generálódna a több száz termékjellemző alapján
  4. Egy kategória összes gyerek kategóriájában a termékek rekurzívan kérdeződnének le.

 

Szakmai zsargon az indexelésben

Még mielőtt bemutatnám a Magento Indexelés menetét fontos tisztázni néhány alapfogalmat.

  • Indexed data (indexelt adat) – Az az adattömb, amely alapján a felhasználói felület megjelenítése történik
  • Indexer – Adattömb létrehozására alkalmas eljárás
  • Index event (index esemény) – Az a pillanat, amely a forrás adat megváltoztatásakor történik
  • Index process (index folyamat) – Az az időszak, amikor az indexer fut
  • Main controller – Feladatokat ad át az index folyamatnak

 

Magento Indexelési folyamat

Az alábbi ábrán látható a Magento Indexelési folyamata:

 

 

magento indexelési folyamat

 

Magento eseménnyel (Magento event) és manuálisan is el lehet indítani az indexelést. Indexelés közben a felhasználói felületen az adatok az EAV táblákból lesznek kiolvasva, ezért nem ajánlott csak indokolt esetben az újraindexelést.

 

Magento Indexelés részletes bemutatása

A katalógus és termék indexelés alapból ki van kapcsolva mind a Magento CE mind a Magento EE esetén. A bekapcsolásához System -> Configuration -> CATALOG -> Catalog -> Frontend -> Use Flat Catalog Category és Use Flat Catalog Category lists legördülőknél a YES-t kell választani.

A mentés után a Magento notification area-ban jelzi, hogy újraindexelés szükséges.

 

magento indexelés bekapcsolás

A Magento notification area közvetlenül az adminban, közvetlenül a menü alatt látható.

 

Magento indexelés futtatási lehetőségek

 

1) Magento admin

Válasszuk adminban a System -> Index management menüpontot. Kattintsunk a Select All linkre, az Actions opciónál a Reindex Data legyen kiválasztva, majd kattintsunk a Submit gombra

 

magento indexelés futtatás admin

 

2) Shell script

Indítsunk egy terminált, majd navigáljunk Magento gyökérkönytárába és adjuk ki az alábbi parancsot:

php shell/indexer.php –reindexall

 

Magento indexelés futtatás shell script

 

Lehetőségünk van csak egy indexet is futtatni ha –-reindex <indexer> paraméterrel futtatjuk az indexer.php-t. Például, ha katalógus url-eket szeretnénk újraindexelni, akkor futtassuk az alábbi parancsot:

php shell/indexer.php — reindex catalog_url

 

Magento indexelés futtatás shell script

 

Ha az info paramétert adjuk meg az indexernek, akkor egy listát fogunk kapni az összes indexről és az indexek kódjairól

 

Magento indexelés futtatás shell script

 

+1 módszer: php kódból

Futtassuk a teljes újraindexeléshez az alábbi kódot:

<?php
/* @var $indexCollection Mage_Index_Model_Resource_Process_Collection */
$indexCollection = Mage::getModel('index/process')->getCollection();
foreach ($indexCollection as $index) {
    /* @var $index Mage_Index_Model_Process */
    $index->reindexAll();
}

Ha csak egy indexet szeretnék frissíteni, akkor az alábbi kód is elég:

<?php
$process = Mage::getModel('index/indexer')->getProcessByCode('catalog_product_price');
$process->reindexAll();
}
catalog_product_price helyett írjuk be azt az index nevet, amelyet szeretnénk frissíteni.

Magento index táblából való olvasás gyorsítása

Lehetőségünk van a MySQL tábla indexeket raknunk az index táblákra. Ezt megcsinálhatjuk manuálisan is, mondjuk phpMyAdminból, de egy esetleges újraindexelés során már nem leszsznek meg azok az indexek, mert minden újraindexelésnél törli és létrehozza a Magento az index táblákat. Ennél picit precízebb megoldásra van szükségünk.

Az alábbi példában a termék indexre teszünk indexeket.

Hozzunk létre egy modult, amelynek a config.xml-jében iratkozzunk fel a catalog_product_flat_prepare_indexes eseményre az alábbi módon:

<catalog_product_flat_prepare_indexes>
    <observers>
        <aion_catalog_product_flat_prepare_indexes>
            <type>singleton</type>
            <class>aion_catalog/observer</class>
            <method>catalogProductFlatPrepareIndexes</method>
        </aion_catalog_product_flat_prepare_indexes>
    </observers>
</catalog_product_flat_prepare_indexes>

A fenti xml részletből látszik, hogy az Aion_Catalog_Model_Observer osztály catalogProductFlatPrepareIndexes metódusa fog meghívódni termék újraindexelés előtt. Ilyenkor már létrejött a tábla, nekünk csak annyi a feladatunk, hogy rátegyük az új indexeket a táblára:

/**
 * Add indexes to product flat table
 *
 * @param Varien_Event_Observer $observer observer
 *
 * @return void
 */
public function catalogProductFlatPrepareIndexes(Varien_Event_Observer $observer)
{
    /** @var Varien_Object $indexesObject */
    $indexesObject = $observer->getIndexes();
    /** @var array $indexes */
    $indexes = $indexesObject->getIndexes();
 
    /**
     * Ezekre a mezőkre teszünk indexeket a gyorsabb lekérdezések érdekében
     */
    $addFields = array(
        'upload_date', 'news_to_date', 'special_price', 'special_from_date', 'special_to_date'
    );
 
    foreach ($addFields as $field) {
        $indexes['IDX_'.strtoupper($field)] = array(
            'type' => Varien_Db_Adapter_Interface::INDEX_TYPE_INDEX,
            'fields' => array($field)
        );
    }
 
    $indexesObject->setIndexes($indexes);
}

Az $addFields tömböt kiegészíthetjük más jellemzőkkel is. Ügyeljünk arra, hogy nem minden oszlop típusra lehet tenni indexet.

 

Indexeléskor jelentkező hibák

Előfordulhat, hogy az Index Management menüpontban sokáig a processing státusszal van egy-egy index. Ez azt jelenti, hogy var/locks mappában lévő index_process_*.lock fájlokat a php nem tudta lezárni. A legegyszerűbb mód a hiba javítására a lock fájlok törlése.

Egy másik gyakori eset, amikor a flat tábla sérül meg és emiatt nem hajtható végre az indexelés. Ilyen esetben nyugodtan lehet törölni a sérült flat táblát, mert újraindexelésnél ellenőrzi a Magento, hogy létezik-e az a tábla és ha nem, akkor létrehozza.

Az oszlopok mérete MySQL-ben 4096 oszlopra van maximalizálva, de ez gyakorlatban jóval kevesebb. Függ attól is, hogy az egyes oszlopok hány karaktert tudnak tárolni. Ebből adódóan az index tábláknál is előfordulhat az, hogy nem tud létrejönni a tábla. Ez a hiba eléggé alattomos, mert az adminban csak az látszik, hogy nem indexelhető újra a tábla, de a magyarázatot már a szerver beállításokban kell megtalálni.

Ha ilyen hibába futunk bele, mindig át szoktuk nézni a jellemzőket, hogy biztos mindegyik kell-e a flat táblákba. Ha le tudjuk csökkenteni a jellemzők számát, illetve a méretét (pl. text helyett varchar-t használni), könnyen ki tudjuk iktatni ezt a hibát is.

Sajnos a legalattomosabb hiba az, amikor félbeszakad az indexelési folyamat. Ez olyan esetekben fordul elő, amikor kevés a memória, futási idő limit a webszerveren. Védekezni ellene csak úgy lehet, ha megnöveljük a php által használható memóriát és a futási időt is magasabbra vesszük.

Még egy lehetséges megoldás az indexelés parancssorból való indítása, amire a „Magento indexelés futtatási lehetőségek” második pontjában tértem ki (2. shell script).

 

Magento indexelés hátrányai

Nem szeretnék senkit se összezavarni, a Magento indexelés nagyon hasznos eleme a Magentonak. Ezzel egy időben ismernünk kell a hátrányait is. Íme néhány hátránya:

  1. Adatot dupláz. Mivel az adminban az EAV-s adatstruktúrába íródnak az adatok, de frontenden az index táblákból vannak kiolvasva, ezért minden termék adat kétszer szerepel az adatbázisban. Ha nem figyelünk az újraindexelésre, akkor könnyen eshetünk abba a hibába, hogy felhasználói felületen mást látunk mint az adminban.
  2. Erőforrás igényes. Nagyon sok server erőforrást használ a Magento indexelés, mivel rengeteg helyről olvas ki adatokat.
  3. Könnyen bele tudunk ütközni a MySQL oszlop maximumba. Erről az esetről az Indexeléskor jelentkező hibák alatt már írtam.

 

Végszó

Remélem, hogy a fenti cikkben sikerült bemutassam a Magento indexelésben rejlő lehetőségeket és segítséget is tudtam nyújtani az esetleges előforduló gyakori hibák megoldásában. Amennyiben akad valamilyen problémája, szívesen válaszolunk a kérdésekre és segítünk azt közösen megoldani. Cikkünket frissíteni fogjuk ezekkel a kérdések megválaszolásával.

 

 

2 válaszok

Hagyjon egy választ

Want to join the discussion?
Feel free to contribute!

Vélemény, hozzászólás?

Az email címet nem tesszük közzé.