Michael Spiller: MYSQL - Fulltext und Abfrage über mehrere Tabellen

Beitrag lesen

Hallo!

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.

Ich meinte damit, dass die Suche nicht über den jeweiligen Fulltex-Index geschieht.

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.

Ist das auch möglich? (Z.B. mit Merge-Tabellen?)

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.

Habe ich bereits getestet, es werden nur die Indizes über user_id verwendet.

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.

Gilt das auch, wenn die Felder, die mit LIKE durchsucht werden, gar nicht indiziert sind? EXPLAIN liefert mir immer die Auskunft, dass die Indizes über user_id verwendet werden, weil die Abfrage ja hierüber verknüpft ist.

Bei dieser Abfrage: EXPLAIN  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
FROM verzeichnis AS v, member AS m WHERE (
MATCH ( m.firma, m.name, m.vorname, m.strasse )
AGAINST (  '+suchwort*'
IN BOOLEAN
MODE  ) OR
MATCH ( v.begriffe )
AGAINST (  '+suchwort*'
IN BOOLEAN
MODE  ) )
ORDER  BY m.firma
liefert mir EXPLAIN die Info, dass überhaupt kein Index verwendet wird, obwohl ich einen Fulltext-Index in member über firma, name, vorname, strasse sowie einen in verzeichnis über begirffe gelegt habe.

Und das dauert eben...

Danke schon mal für die Antwort, habe mich wahrscheinlich ein bisserl zu unverständlich ausgedrückt.

Michael