Sven Rautenberg: MYSQL - Fulltext und Abfrage über mehrere Tabellen

Beitrag lesen

Moin!

Das Problem ist nun, dass MYSQL nicht die Fulltext-Indexe verwendet, sondern nur die Primary-Keys (das sind die über user_id liegenden Indexe, da user_id per auto_increment erzeugt wird), was zu sehr langen Suchzeiten führt.

Kann es sein, dass fulltext nicht bei SELECT-Abfragen funzt, oder mache ich was falsch?

Du solltest dich mal über den Sinn des Volltextindex bei MySQL informieren. Der macht nämlich nicht einfach eine Volltextsuche über deine Datenbank.

Und allein mit einem Volltextindex ist es auch nur in den seltensten Fällen getan. Oftmals muß man seinen Datenbestand für eine effektive Suche selbst eigenhändig indizieren, also einen passenden Parser und Suchschema schreiben, damit man was findet.

Eine Möglichkeit, die ich mir überlegt habe ist, ob es eine Möglichkeit gibt eine verknüpfte Tabelle aus den zu durchsuchenden zu erstellen, die bei Aktualisierung der "Basistabellen" sich autmaotisch mit aktualisert und ich diese so für meine Suche verwenden kann, in dem ich in der verknüpften Tabelle meinen Fulltext-Index erstelle. Ist so was möglich?

Ich schätze, das ist das, was ich einen Absatz weiter oben geschrieben habe.

Wäre für Ratschläge, auch in andere Richtungen als meine Überlegungen sind, sehr dankbar!

EXPLAIN würde zumindest schon mal klären, welche Indices bei dir benutzt werden.

Obwohl: Wenn du mit LIKE '%suchwort%' suchst, dann kommt KEIN Index zum Einsatz, sondern es erfolgt ein Full Table Scan - die Datenbank wird also in Gänze komplett einmal (mit Pech mehrmals) eingelesen und durchforstet.

Und das dauert eben...

Ach ja: Das ist meine Abfrage: SELECT m.user_id, m.berecht, v.branche1, v.branche2, v.branche3, v.mo_v1, v.mo_v2, v.mo_n1, v.mo_n2, v.di_v1, v.di_v2, v.di_n1, v.di_n2, v.mi_v1, v.mi_v2, v.mi_n1, v.mi_n2, v.do_v1, v.do_v2, v.do_n1, v.do_n2, v.fr_v1, v.fr_v2, v.fr_n1, v.fr_n2, v.sa_v1, v.sa_v2, v.sa_n1, v.sa_n2, v.so_v1, v.so_v2, v.so_n1, v.so_n2, m.firma, m.strasse, m.plz, m.ort, m.tel, m.email, m.homepage, MIN(w.start), MAX(w.end) FROM verzeichnis AS v INNER JOIN member AS m USING (user_id) LEFT JOIN werbung AS w ON m.user_id=w.user_id WHERE (m.plz = '64347' OR v.plzen LIKE '%alle%' OR v.plzen LIKE '%64347%' OR m.plz = '64343' OR v.plzen LIKE '%alle%' OR v.plzen LIKE '%64343%' OR m.plz = '64344' OR v.plzen LIKE '%alle%' OR v.plzen LIKE '%64344%' OR m.plz = '64345' OR v.plzen LIKE '%alle%' OR v.plzen LIKE '%64345%') AND (MATCH (m.firma,m.name,m.vorname,m.strasse) AGAINST ('+anwalt*' IN BOOLEAN MODE) OR MATCH (v.begriffe) AGAINST ('+anwalt*' IN BOOLEAN MODE)) GROUP BY m.user_id ORDER BY m.firma

- Sven Rautenberg

--
Die SelfHTML-Developer sagen Dankeschön für aktuell 20065,57 Euro Spendengelder!