Autor Zpráva
midlan
Profil
Ahoj,

mám problém s rychlostí dotazu (resp. pohledu na něj). Jedná se o strukturu EAV, systém Magento. Dotaz vybírá několik atributů produktu pro různé obchody. Obchody jsou 4 a produktů kolem 30000, dotaz tedy vrací kolem 120000 záznamů. Nejpodivnější na všem je, že v pátek žádné problémy s rychlostí nebyly, procházení pohledu pomocí nástroje Adminer trvalo kolem 1.5s. Dnes najednou z ničeho nic kolem 40 sekund. A to jsem v pátek ještě eliminoval 3 JOINY. Navrácení v předchozí stav však stejně nepomohlo. Už jednou jsem řešil problémy s rychlostí dotazu, ale to jsem doplnil chybějící indexy podle EXPLAIN a problém se vyřešil. Kam by se měla ubírat další moje snaha optimalizace? Problémový dotaz:

CREATE OR REPLACE VIEW pohled AS
    SELECT
        CONCAT(s.store_id, '-', p.entity_id, IFNULL(CONCAT('-', l.product_id), '')) AS store_product_parent_id,
        p.entity_id,
        s.store_id,
        l.product_id AS parent_id,
        p.type_id,
        IFNULL(translation.value, 0) AS translation,
        name_pattern.value AS name_pattern,
        name.value AS name,
        short_description_pattern.value AS short_description_pattern,
        short_description.value AS short_description,
        description_pattern.value AS description_pattern,
        description.value AS description
    FROM core_store AS s
    INNER JOIN catalog_product_entity AS p ON
        (s.store_id != 1)
        AND (s.is_active)
    INNER JOIN eav_attribute AS a ON
        a.attribute_code = CONCAT('translation_', s.code)
    LEFT JOIN catalog_product_entity_int AS translation ON
        (translation.entity_id = p.entity_id)
        AND (translation.attribute_id = a.attribute_id)
        AND (translation.store_id = 0)
    LEFT JOIN catalog_product_entity_varchar AS name_pattern ON
        (name_pattern.entity_id = p.entity_id)
        AND (name_pattern.attribute_id = IF(s.store_id = 0, '185', '63'))
        AND (name_pattern.store_id = 0)
    LEFT JOIN catalog_product_entity_varchar AS name ON
        (name.entity_id = p.entity_id)
        AND (name.attribute_id = '63')
        AND (name.store_id = s.store_id)
    LEFT JOIN catalog_product_entity_text AS short_description_pattern ON
        (short_description_pattern.entity_id = p.entity_id)
        AND (short_description_pattern.attribute_id = IF(s.store_id = 0, '658', '65'))
        AND (short_description_pattern.store_id = 0)
    LEFT JOIN catalog_product_entity_text AS short_description ON
        (short_description.entity_id = p.entity_id)
        AND (short_description.attribute_id = '65')
        AND (short_description.store_id = s.store_id)
    LEFT JOIN catalog_product_entity_text AS description_pattern ON
        (description_pattern.entity_id = p.entity_id)
        AND (description_pattern.attribute_id = IF(s.store_id = 0, '657', '64'))
        AND (description_pattern.store_id = 0)
    LEFT JOIN catalog_product_entity_text AS description ON
        (description.entity_id = p.entity_id)
        AND (description.attribute_id = '64')
        AND (description.store_id = s.store_id)
    LEFT JOIN catalog_product_link AS l ON
        (l.link_type_id = 3)
        AND (l.linked_product_id = p.entity_id)
;
midlan
Profil
Vypadá to, že problém byl identifikován. Zřejmě je na testovacím serveru málo paměti, protože na produkci dotaz běhá rychle. Nejspíš se o víkendu nějaká paměť na testovacím serveru zaplnila, proto najednou takové markantní zhoršení.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0