So, die Lösung ist gefunden!
Für die Interessierten: Die Syntax der Oder-Abfrage lautet jetzt wie folgt:
SELECT
title,description,url,SUM(v.score) hscore
FROM
w_pages s,w_keyword t,w_occ v
WHERE
v.word_id = t.keyword_id AND
s.id = v.page_id AND
s.typ = 'g' AND
(MATCH(t.keyword) AGAINST('dorit') OR s.id IN (SELECT s.id FROM
w_pages s,w_keyword t,w_occ v
WHERE
MATCH(t.keyword) AGAINST('constantin') AND
v.word_id = t.keyword_id AND
s.id = v.page_id) )
GROUP BY
url
ORDER BY
hscore DESC, url ASC
Limit 0, 100
Was hat sich geändert? 2 Punkte:
- Die Unterabfrage steht jetzt nicht mehr im FROM-Abschnitt der äußeren Abfrage, sondern im WHERE-Abschnitt. Das hat schon mal ein bischen Performance gebracht.
- Die beiden Bedingungen, die mit OR verknüpft sind, werden jetzt von einer Klammer umfasst. Und das war tatsächlich entscheidend! Erst damit habe ich den Server dazu gebracht, die Abfrage überhaupt zu bewältigen.
Dementsprechend sieht auch die "EXPLAIN"-Antwort viel besser aus:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY s ALL PRIMARY NULL NULL NULL 1386 Using where; Using temporary; Using filesort
1 PRIMARY v ref PRIMARY,page_id,word_id page_id 4 p_galleries.s.id 61 Using index
1 PRIMARY t eq_ref PRIMARY PRIMARY 4 p_galleries.v.word_id 1 Using where
2 DEPENDENT SUBQUERY s eq_ref PRIMARY PRIMARY 4 func 1 Using index
2 DEPENDENT SUBQUERY t fulltext PRIMARY,kw_full kw_full 0 1 Using where
2 DEPENDENT SUBQUERY v eq_ref PRIMARY,page_id,word_id PRIMARY 8 func,p_galleries.t.keyword_id 1 Using where; Using index
Dennoch: Falls jemand Verbesserungs-Tipps hat, wäre ich nach wie vor dankbar:o)
Grüße,
Constantin