Michael Schröpl: Große Datenbank organisieren

Beitrag lesen

Hi RFZ,

Query: EXPLAIN SELECT * FROM stories WHERE MATCH (inhalt, titel) AGAINST ('weekend') AND MATCH (inhalt, titel) AGAINST ('party') LIMIT 0, 10
So, und dieser Suchvorgang hat nun 15 Sekunden gedauert!!

ein AND über zwei FULLTEXT-Zugriffe kann natürlich einen impliziten JOIN über beliebig viele Zeilen produzieren.
Möglicherweise bekommst Du am Ende nur 10 Treffer, aber vorher hattest Du 1000 Treffer für "weekend" und 4000 für "party", und die mußten miteinander ausmultipliziert werden, um die Schnittmenge zu berechnen. Ein AND über schlechte Suchbegriffe kann sehr teuer sein - und weit über 90% der Verarbeitungszeit findet ggf. außerhalb der Einflußnahme Deines FULLTEXT-Index statt.

Mach mal die beiden Einzelsuchen (ohne Trefferausgabe) und miß deren Dauer - dann weißt Du, wie teuer das AND war.

Was für Indizes brauch ich?
Diejenigen, die Deine Statements beschleunigen.
Sollte ich dazu was best. wissen?

nach Deinem obigen Beispiel machst Du schon alles richtig - Du bist nur genau in die Schwachstelle Deiner Architektur gerannt.

Ich habe etwas sehr ähnliches wie Du hier produktiv laufen. Zu Vermeidung Deines Problems habe ich eine blacklist über "schlechte" Suchbegriffe; wenn auf dieser beispielsweise "party" stehen würde, dann würde meine Suchmaschine nur über "weekend" suchen und dann alle Treffer explizit nach "party" scannen (in einem zweiten Durchgang). Das kann eventuell deutlich schneller sein, wenn zwischen beiden Suchbegriffen mindestens eine Zehnerpotenz an Treffern liegt (der Trick liegt also darin, sich ein Programm zu schreiben, was eine "vernünftige" blacklist berechnet).
Aber ein System, das _nur_ mit schlechten Suchbegriffen arbeitet, kriegst Du mit FULLTEXT und AND nicht wirklich performant hin.

Viele Grüße
      Michael

--
T'Pol: I apologize if I acted inappropriately.
V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
(sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.