constantin: Performance-Problem bei Website-Suche

Beitrag lesen

Hallo zusammen,

meine (selbst zusammengeschraubte) Website-Suche kann Und-Abfragen (z.B. constantin dorit), Nicht-Abfragen (constantin -dorit) und Oder-Abfragen (constantin or dorit). Die Und-Suche funktioniert ganz normal, die nicht-suche ist schon um einiges langsamer und bei der oder-suche steht der Server still und liefert auch nach Minuten kein Ergebnis.

Die Suche involviert drei Tabellen:
w_pages (Tabelle mit den indizierten Seite meiner site)
w_keyword (Suchbegriffe)
w_occ ("Vorkommen"-Tabelle)

w_pages und w_keyword haben als PK eine ID und stehen in einer n:n Beziehung zueinander. Beide sind über ihren PK mit der Vorkommen-Tabelle verknüpft. Die Vorkommen-Tabelle nutzt die beiden Fremdschlüssel ihrerseits als zusammengesetzten PK.

Die Tabellenstruktur und meine Abfragensyntax stimmen, so viel ist sicher. Denn wenn ich die Datensatzanzahl bei der Keyword-Tabelle und bei der Vorkommen-Tabelle zu Testzwecken radikal verkleinere, dann funktioniert auch die Oder-Suche.

Hier die Syntax meiner Oder-Suche:

  
SELECT  
  title,description,url,SUM(v.score) hscore  
FROM  
  w_pages s,w_keyword t,w_occ v, (SELECT s.id FROM  
                                    w_pages s,w_keyword t,w_occ v  
                                  WHERE  
                                    t.keyword LIKE '%constantin%' AND  
                                    v.word_id = t.keyword_id AND  
                                    s.id = v.page_id) a0  
WHERE  
  v.word_id = t.keyword_id AND  
  s.id = v.page_id AND  
  t.keyword like '%dorit%'  OR s.id = a0.id AND  
  s.typ = 'g' AND  
  s.lang = 'd'  
GROUP BY  
  url  
ORDER BY  
  hscore DESC, url ASC  
Limit 0, 100  

An der Server-Konfiguration kann ich nichts ändern, da ich nur ein einfaches Webhosting-Paket ohne eigenen Server habe. Andererseits bin ich sicherlich kein Experte für die Feinheiten bei MySql und vermute, dass sich bei meiner Suche Einiges optimieren lässt.

Könnt Ihr mir Tipps geben, was ich verbessern kann, bzw. wo ich ansetzen sollte?

Vielen Dank,
Constantin