Autor | Zpráva | ||
---|---|---|---|
StepanMatl Profil |
#1 · Zasláno: 15. 3. 2013, 12:19:48
Dobrý den, prosím o vysvětlení, proč se jeden z následujících dotazů provede mnohem rychleji.
Dotaz 1 - 2,5s $sql=$mysqli->query("SELECT k.nazev, IFNULL(COUNT(i.id), 0) AS pocet FROM kategorie AS k LEFT JOIN inzeraty AS i ON k.id=i.kategorie AND i.aktivni=1 GROUP BY k.id ORDER BY pocet DESC, k.nazev"); Dotaz 2 - 0,3s $sql=$mysqli->query("SELECT k.nazev, p.pocet FROM kategorie AS k LEFT JOIN (SELECT kategorie, COUNT(id) AS pocet FROM inzeraty WHERE aktivni=1 GROUP BY kategorie) AS p ON p.kategorie=k.id ORDER BY p.pocet DESC, k.nazev"); Děkuji! |
||
Tori Profil |
#2 · Zasláno: 15. 3. 2013, 12:31:48
Koukl jste na EXPLAIN těch dotazů? To by mohlo napovědět.
|
||
StepanMatl Profil |
#3 · Zasláno: 15. 3. 2013, 13:39:05
Výsledky EXPLAIN:
Dotaz 1 SELECT_TYPE: SIMPLE TABLE: k TYPE: ALL POSSIBLE_KEYS: KEY: KEY_LEN: REF: ROWS: 12 EXTRA: Using temporary; Using filesort Dotaz 2 SELECT_TYPE: PRIMARY TABLE: k TYPE: ALL POSSIBLE_KEYS: KEY: KEY_LEN: REF: ROWS: 12 EXTRA: Using temporary; Using filesort Index je na sloupci inzeraty.id (primary), brzdí to jednoznačně GROUP BY k.id v prvním dotazu... |
||
Tori Profil |
#4 · Zasláno: 15. 3. 2013, 13:51:24
To by mělo myslím vrátit dva řádky, pro každou tabulku/poddotaz jeden. Je index i na inzeraty.kategorie?
|
||
peta Profil |
Tohle by meli byt indexy prvniho dotazu, k.nazev mozna taky.
ON k.id=i.kategorie AND i.aktivni=1 GROUP BY k.id ORDER BY pocet DESC, k.nazev Tohle by meli byt indexy druheho dotazu. aktivni=1 GROUP BY kategorie ON p.kategorie=k.id ORDER BY p.pocet DESC, k.nazev |
||
Časová prodleva: 11 let
|
0