Autor Zpráva
matak
Profil
Máte někdo tip, proč tento dotaz, trvá tak dlouho?

Tohle trvá 0.01

SELECT IDproduct FROM shop__products_parameters WHERE IDvalue IN (818,874,858) GROUP BY IDproduct HAVING COUNT(IDproduct)=3;

A tohle

SELECT p.IDproduct FROM shop__products as p WHERE p.IDproduct IN (

SELECT IDproduct FROM shop__products_parameters WHERE IDvalue IN (818,874,858) GROUP BY IDproduct HAVING COUNT(IDproduct)=3

);


50sekund
tiso
Profil
matak: koľko hodnôt ti vráti ten prvý select?
matak
Profil
to je to nejvtipnější, jen jednu, vyzkoušeno jak na testovacím stroji, tak na ostrém stroji

stroj je opravdu maximálně předimenzovaný, má 128MB innodb buffer, 2gb paměti, XEON čtyřjádrový, v hardwaru chybu nehledat
Kajman_
Profil *
V mysql se "where in (select)" často vykonává pro každý řádek. Prý na tom zapracovali ve verzi 5.4, ale je lepší přepsat dotaz na

SELECT p.IDproduct FROM shop__products as p, (
  SELECT IDproduct FROM shop__products_parameters WHERE IDvalue IN (818,858,874) GROUP BY IDproduct HAVING   COUNT(IDproduct)=3
) o where p.IDproduct=o.IDproduct


Optimální index bude asi (idvalue,idproduct). Ale jak se použije, prozdradí explain. Ještě jsem kdysi četl, že hodnoty v in je lepší seřadit, ale to jsem nikdy netestoval.
matak
Profil
tedy máš na mysli

JOIN (SELECT IDproduct, COUNT(IDproduct) __countAvailable FROM shop__products_parameters WHERE IDvalue IN (818,950,858) GROUP BY IDproduct HAVING __countAvailable=3) as pp ON (p.IDproduct=pp.IDproduct)

coz sem teda udělal a pomohlo to, problém ovšem je když ten join uvnitř vrátí např. 30000 řádků, tak jsem tam kde před tím, to bude asi tím, že nemá index že (v selectu asi těžko hledat nějaký index)?
matak
Profil
v každém případě díky
Kajman_
Profil *
Ještě můžete zkusit group po joinu, jestli to náhodou nebude v tomhle případě rychlejší. Indexy pomůže odladit explain.

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: