Autor Zpráva
aDAm
Profil
Zdarvím, řeším teď optimalizaci sql dotazů které mají vnořené poddotazy a nevím které řešení je pro server výhodnější:

Mám tabulku třeba uživatelů a pak tabulku objednávek a diskuze. Když vypisuju uživatele tak chci vypsat kolik má objednávek a kolik poslal dotazů

1. Udělat select uživatelů a pak jednotlivé záznamy procházet a dělat selecty na dalších tabulkách a ty pak přidávat.

2. Udělat select na uživatele s vnořenými selecty které získají konkrétní počty.

3. Uděla pohledovou tabulku kde budou ty vnořené selecty aplikované a pak už jen dělat obyč selecty na ten pohled


č.1 jsem zavrhl protože se tady nedá sortovat podle těch počtů, popřípadě filtrovat, takže se rozhoduju mezi 2 a 3. Způsob č.2 mám zatím implementován a vypadá ok, pokud je málo dat tak je svižný, ale jakmile je na db několik stovek záznamů tak už se ty dotazy neúměrně prodlužujou.
Způsob č.3 jsem zatím vyzkoušel na malé tabulce tak nemám reálné porovnání s č.2

Je tedy některé z těchto řešení ok? Nebo jdu špatnou cestou a měly by ty dotazy vypadat jinak?
okolojdouci
Profil *
Lepší než vnořený select může být připojování tabulek joinem. Záleží na okolnostech. Ale stovky záznamů jsou zanedbatelné číslo, to musí fungovat bleskově. Jestli nefunguje, nejspíš ty dotazy konstruuješ špatně.
aDAm
Profil
jo JOINem sem to někde dělal ale když se spojilo více tabulek (nějaké doplňkové info k uživateli) tak už to nebylo ono a v některých případech to nevrátilo korektní výsledek.
okolojdouci
Profil *
aDAm:
Můžeme si tři dny povídat o tom, co je a co není dobré řešení.
Nebo můžeš položit konkrétní otázku a dostat konkrétní odpověď.
aDAm
Profil
Konkrétní otázka snad byla pložena ne?

Prostě mám:
SELECT ..data..
FROM user AS u
LEFT JOIN user_info AS ui ON ui.user_id = u.user_id
LEFT JOIN user_addres AS ua ON ua.user_id = u.user_id
WHERE xy
GROUP BY u.user_id
LIMIT 0,50

dejme tomu že v tabulce uživatelů je 1000 záznamů, stejný počet v info a 2-3x víc v adrese

tento dotaz ještě potřebuju rozšířit o počet objednávek a počet příspěvků v diskuzi. v objednavkach je třeba x tis záznamů a v diskuzi mnohem víc.

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