| 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 |
#2 · Zasláno: 24. 5. 2016, 14:37:01
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í.
|
||
|
Časová prodleva: 10 let
|
|||
0