Autor Zpráva
wig
Profil
Prosim o radu co nechat naindexovat aby se nevytvarelo filesort

EXPLAIN SELECT firmy.titulek, firmy.id, firmy.popiscinnosti, firmy.seotitulek, firmy.adresa, firmy.mesto, firmy.logo
FROM firmy, firmy_tagyh
WHERE firmy.idcislo = firmy_tagyh.idcislofirmy
AND firmy.schvaleni = '1'
GROUP BY firmy.id
ORDER BY firmy.top DESC , firmy.bodovani DESC
LIMIT 0 , 25

1     SIMPLE     firmy     ref     idcislo,schvaleni     schvaleni     1     const     164933     Using where; Using temporary; Using filesort
1     SIMPLE     firmy_tagyh     ref     idcislofirmy     idcislofirmy     4     nazevdb.firmy.idcislo     2     Using index

Moderátor Kajman: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
ninja
Profil
Zkuste přidat společný index přes 2 sloupce: firmy.top, firmy.bodovani
Kajman
Profil
Pokud mají skoro všechny firmy nějaké tagy, můžete zkusit jeden index nad třemi sloupci (schvaleni, top, bodovani) a upravit dotaz na

SELECT firmy.titulek,
       firmy.id,
       firmy.popiscinnosti,
       firmy.seotitulek,
       firmy.adresa,
       firmy.mesto,
       firmy.logo
FROM   firmy
WHERE  firmy.schvaleni = '1'
HAVING EXISTS (SELECT idcislofirmy
               FROM   firmy_tagyh
               WHERE  firmy_tagyh.idcislofirmy = firmy.idcislo)
ORDER  BY firmy.top DESC,
          firmy.bodovani DESC
LIMIT  0, 25

Pokud jsou navíc skoro všechny firmy schválené, tak by mohl být jen index na (top, bodovani) a podmínku na schválení přesunout do having.
wig
Profil
diky - výsleek je však bohužel stejný.

a k doplnění lze předpokládat, že jsou skoro všechny firmy schváleen a skoro všechny mají tagy
Kajman
Profil
wig:

Pomalu si přidávejte omezení - zkoušejte si ty dotazy a explainy postupně - kdy to ještě je svižné a kdy ne. (U zmíněných dotazů je vždy potřeba pro to rychlé řazení složený index nad sloupci (top, bodovani).)

SELECT firmy.*
FROM   firmy
ORDER  BY firmy.top DESC,
          firmy.bodovani DESC
LIMIT  0, 25

SELECT firmy.*
FROM   firmy
HAVING firmy.schvaleni = '1'
ORDER  BY firmy.top DESC,
          firmy.bodovani DESC
LIMIT  0, 25

SELECT firmy.*
FROM   firmy
HAVING firmy.schvaleni = '1'
   AND EXISTS (SELECT idcislofirmy
               FROM   firmy_tagyh
               WHERE  firmy_tagyh.idcislofirmy = firmy.idcislo)
ORDER  BY firmy.top DESC,
          firmy.bodovani DESC
LIMIT  0, 25

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