constantin: Performance-Problem bei Website-Suche

Beitrag lesen

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:

  1. 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.
  2. 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