Autor Zpráva
Joska
Profil
Zdravím,

v pokročilejších MySQL dotazech jsem začátečník, proto bych chtěl někoho znalejšího požádat o pomoc s následujícím problémem. Mám tabulku s knihovnou elektronických dokumentů o 4500 záznamech a 10 sloupcích. Na sloupci název a anotace mám fulltext index. Spustím li záznam, trvá tak přes 3 minuty proces mysql jede na 33% CPU, než se systém přes příkaz prokouše. Syntaxe dotazu je následující:

SELECT dokumenty.id, dokumenty.autor, dokumenty.nazev, dokumenty.anotace, dokumenty.stav, dokumenty.stazeno, dokumenty.pridano, dokumenty.typ, autori.jmeno AS autor, kategorie.nazev AS kategorie
FROM `dokumenty`
LEFT JOIN `kategorie` ON kategorie = kategorie.id
RIGHT JOIN `autori` ON autor = autori.id
WHERE MATCH (
dokumenty.nazev, dokumenty.anotace
)
AGAINST (
'hledany_retezec'
)
LIMIT 300

Nevíte někdo, jak tento dotaz optimalizovat? Děkuji.
Alphard
Profil
Joska:
Na sloupci název a anotace mám fulltext index
Máte ho na obou sloupcích, tedy FULLTEXT (nazev, anotace) a nikoliv jednotlivě?
Joska
Profil
jj, přidával jsem to dotazem alter table kh_knihy add fulltext (nazev,anotace)
Alphard
Profil
A zkoušel jste, jak dlouho se provádí dotaz bez toho join?
Joska
Profil
Právě že zkoušel, bez nich to běhá jak má, tj. sotva zlomek vteřiny. Ty JOIN jsou ten problém. Věřím, že by měl existovat způsob, jak to vyřešit na úrovni databáe. Nechce se mi to totiž úplně dělit do tří dotazů, a seskupovat to na úrovni PHP.
Alphard
Profil
Abych pravdu řekl, nevím, jestli MySQL správně použije indexy na poddotaz. Zkuste tohle a jestli to nepomůže, počkejte na někoho jiného.
select d.*, autori.jmeno AS autor, kategorie.nazev AS kategorie 
from (
  SELECT dokumenty.id, dokumenty.autor, dokumenty.nazev, dokumenty.anotace, dokumenty.stav, dokumenty.stazeno, dokumenty.pridano, dokumenty.typ, dokumenty.kategorie, dokumenty.autori
  FROM `dokumenty` 
  WHERE MATCH ( 
    dokumenty.nazev, dokumenty.anotace 
  ) 
  AGAINST ( 
    'hledany_retezec' 
  ) 
) d
LEFT JOIN d.`kategorie` ON kategorie = kategorie.id 
RIGHT JOIN d.`autori` ON autor = autori.id 
LIMIT 300
Joska
Profil
vyzkouším, ale opravdu moc děkuji za váš čas.

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: