Hi!
Naja, ich bin nicht wirklich der große Datenbank-Optimierungs Experte ;-)
Nur fürs Verständnis, Du hast eine Tabelle mit viel Text in der Spalte "word". Jeder Datensatz verfügt über eine res_id (die nicht unique ist), wozu Du in zwei anderen Tabellen zusätzliche Informationen gespeichert hast. Jetzt hast Du also einen Suchbegriff ("irgendwas"), und willst jetzt diese zusätzlichen Informationen abfragen, die den Datensätzen mit der res_id zugeordent sind, wo der Suchbegriff "irgendwas" irgendwo im langen Text enthalten ist. War das grob richtig?
In dem Fall würde ich als erstes mal einen richtigen FULLTEXT Index nehmen, und nicht LIKE (alternativ alle Substrings der Wörter in einer indizierten Tabelel speichern, so ähnlich wie bei der neuen SELF-Suche von Daniela - AFAIK).
EXPLAIN SELECT DISTINCT a,b,c,.....
hm, muss das DISTINCT hier sein?
a,b,c bei GROUP BY?
FROM res, res_text,
Du solltest Dir vielleicht besser einen optimalen JOIN-Typ überlegen und angeben
(
SELECT res_words.res_id, res_words.rank
FROM words, res_words
(A)
WHERE word LIKE '%irgendwas%'
Todsünde ;-)
Warum keinen Volltext-Index?
Kannst Du auf die Subquery nicht verzichten?
(B)
AND words.id = res_words.word_id
) AS wort
WHERE server_id =1
(C)
AND res.id = res_text.res_id
(D) (woher kommt eigentlich (E)?)
hat vermutlich mit "Using temporary; " zu tun, oder?
AND res.id = wort.res_id
GROUP BY res.id
ORDER BY score DESC , id ASCErgebnis ist:
meine Bezeichnung|id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra
A|1|PRIMARY|<derived2>|ALL|NULL|NULL|NULL|NULL|35996|Using temporary; Using filesort
das ist schlecht! Er muss eine nichtmal so kleine temporäre Tabelle erstellen, wenn ich das richtig interpretiere, und kann entsprechend auch keinen Index verwenden.
D|2|DERIVED|words|All|PRIMARY|NULL|NULL|NULL|199878|Using where
auch nicht gut, das kommt vermutlich von LIKE %...%.
Wieso kannst Du nicht einfach einen FULLTEXT-Index auf "word" legen, diese Spalte abfragen, und dann per LEFT JOINs anhand von res_id den zugehörigen Rest auslesen?
Wenn das nicht geht, würde ich mir überlegen eine HEAP-Tabelle mit passenden Daten als Index zu erstellen.
Grüße
Andreas
SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/