Autor Zpráva
StepanMatl
Profil
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
Koukl jste na EXPLAIN těch dotazů? To by mohlo napovědět.
StepanMatl
Profil
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
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

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: