Volltextsuche mit weiterem Index

kr1x

Grünschnabel
Hallo,

ich habe folgendes Phänomen:
Durchsuche ich mit der Volltextsuche meine komplette Tabelle ("...WHERE MATCH (name) AGAINST ('fischer')"), werden Ergebnisse im Bruchteil von einer Sekunde ausgegeben.
Erweiter ich jedoch die WHERE Klausel auf eine weitere Spalte ("...WHERE MATCH (name) AGAINST ('fischer') AND aktiviert=1"), dauert die Anfrage mehrere Sekunden.

Klar kann ich jetzt das Ergebnis in PHP auswerten, würde aber lieber gleich nur die gewünschten Ergebnisse zurückbekommen. Ich habe auch schon einen 'normalen' Index auf die Spalte aktiviert gesetzt, das bringt jedoch nichts. Man kann leider keine gemischten(volltext und index) indizien auf mehrere Spalten anlegen, deswegen frage ich hier was zu tun ist.
Im Prinzip würden ja zwei Anfragen gehen, eine die erst alle Ergebnisse mit aktiviert=1 zurückliefert. Die Volltextsuche durchsucht dann nur die zurückgegeben Ergebnisse. Geht sowas mit INNER JOIN?

Danke für antworten
 
hallo!

ich hab ähnliches Problem:

SQL:
SELECT * from talbe WHERE date >= NOW() AND subject LIKE '%blabla%' OR content LIKE '%blabla%' OR ort LIKE '%blabla%' AND act = 1 ORDER BY date asc

Bei mir wird das act = 1 nicht beachtet und er listet alle auf...

Kann mir (uns) jemand helfen?
 
Zuletzt bearbeitet von einem Moderator:
@maga147
versuchs mal mit klammersetzung

Code:
SELECT * FROM talbe WHERE date >= NOW() AND (subject LIKE '%blabla%' OR content LIKE '%blabla%' OR ort LIKE '%blabla%') AND act = 1 ORDER BY date ASC

gruss
 
@kr1x

Ich gehöre zwar zur Oracle-Fraktion, aber ich hätte eine Theorie: ;)

Um zu entscheiden, ob aktiviert 0 oder 1 ist, muß man halt mehr tun, als "nur" eine Volltextsuche. Wenn man sich Ausführungspläne anschauen kann, dann würde ich das mal ausprobieren. Wenigstens sollte man sehen ob der index benutzt wird oder nicht und wenn nicht, warum das so ist. Die Werte für Dein aktiviert sind vermutlich 0 oder 1. Der Index ist also nicht besonders selektiv. Bei Tabellen die "groß" genug sind, lohnt sich die Verwendung, ansonsten wird eher die komplette Tabelle gelesen (was halt dauern kann).

Eine Option wäre mit einem "Trick" nur einen Index zu brauchen. Wenn man den Wert von aktiviert in den Volltextindex "einbaut", reicht die Volltextsuche aus. Es ist quasi so, wie in Deinem ersten SQL. Bei Oracle kann man sowas über einen "function-based index". Man schreibt sich eine Stored Procedure, mit der man die indizierten Werte bestimmen kann. Ob sowas bei mySQL geht, weiß ich leider nicht.

Es gibt ein paar Umwege, mit denen man sowas über Standard-SQL machen kann. Zum Beispiel einfach eine Spalte mit dem kombinierten Wert zu der Tabelle hinzufügen und den indizieren (Volltext). Das hat aber Nachteile. Zum einen hast Du redundante Daten, aber noch "viel besser": 'n Schema mit Normalform 0.... ;) Besser wäre es, bei der Definition eine Funktion anzugeben. Immer noch nicht schön, geht aber schon besser. :D

Alternativen gibt es genug, aber da müßte ich erstmal mySQL-Doku lesen. Da fehlt mir grade die Lust... =)


@maga147

hallo!
SQL:
LIKE '%pattern%'

ist i.d.R. auch keine gute Idee, wenn es sich um große Tabellen handelt - "groß" ist je nach Server unterschiedlich. Ein Index ändert daran nichts.
 
Zuletzt bearbeitet von einem Moderator:
Zurück