Autor | Zpráva | ||
---|---|---|---|
Joska Profil |
#1 · Zasláno: 26. 9. 2010, 20:55:27
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 |
#2 · Zasláno: 26. 9. 2010, 21:05:56
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 |
#3 · Zasláno: 26. 9. 2010, 21:10:35
jj, přidával jsem to dotazem alter table kh_knihy add fulltext (nazev,anotace)
|
||
Alphard Profil |
#4 · Zasláno: 26. 9. 2010, 21:16:52
A zkoušel jste, jak dlouho se provádí dotaz bez toho join?
|
||
Joska Profil |
#5 · Zasláno: 26. 9. 2010, 21:23:52
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 |
#6 · Zasláno: 26. 9. 2010, 21:40:55 · Upravil/a: Alphard
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 |
#7 · Zasláno: 26. 9. 2010, 21:50:31
vyzkouším, ale opravdu moc děkuji za váš čas.
|
||
Časová prodleva: 14 let
|
0