Autor Zpráva
Fidelio
Profil
Zdravím

mám 2 tabulky pro fotky a pro produkty, chci zjistit pocet fotek k produktům,
pokud ale do sql dam i order by xxx tak misto 0,05s dotaz trvá i minutu!


SELECT A.*,ifnull(F.pocet,0) AS pocetF FROM produkt A
LEFT JOIN (SELECT COUNT(pomid) AS pocet,pomid FROM files WHERE typ = 1
AND cesta = 'produkty' GROUP BY pomid) F ON A.id = F.pomid
order by A.nazev
LIMIT 5

Moderátor Kajman: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).

struktura tabulky produktů: http://awesomescreenshot.com/01613k1p07
struktura tabulky obrázků: http://awesomescreenshot.com/0c513k248a

záměr tabulky obrázků je tabulky pro uchovávání všech příloh obrázků i
dokumentů, produktů, aktualit, ... prostě jedna tabulka na vše...

produktů: 16000
obrázků: 40000

Napadá někoho jak nastavit indexy/klíče? Nebo by pomohl smíšený index, nebo tak
něco? Uvítám každou radu.

Nebo existuje nějaký nástroj, který by toto zanalizoval?

Díky.
pcmanik
Profil
Fidelio:
SELECT p.*, COUNT(f.pomid) AS pocet_fotiek
FROM produkt p
LEFT JOIN files f ON f.pomid = p.id AND typ = 1 AND cesta = 'produkty'
GROUP BY p.id
ORDER BY a.nazov
LIMIT 5

A index na stlpec pomid.

Sám si môžes overiť použitie indexov pomocou explain-u
Kajman
Profil
Pokud je tam ten limit 5 a neřadí se podle počtu fotek, tak by mělo být nejsvižnější

SELECT A.*,
       (SELECT Count(pomid) AS pocet
        FROM   files F
        WHERE  F.typ = 1
               AND F.cesta = 'produkty'
               AND A.id = F.pomid)
FROM   produkt A
ORDER  BY A.nazev
LIMIT  5 

Nebo by pomohl smíšený index
Pro dotaz v [#1] by byl opravdu vhodný vícesloupcový index, buď (typ,cesta,pomid) nebo (cesta,typ,pomid). Závisí na četnosti výskytů a na dalších dotaze, který z nich bude výhodnější.

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