Hi Andreas,
Ganz im Gegenteil!
Je eindeutiger die Ergebnisse sind, desto besser der Effekt des
Index.
Was meinst Du jetzt mit eindeutig?
mit eindeutig meine ich "eindeutig". ;-)
Wenn ich PLZ nehme ist das ja im Prinzip ein primärschlüssel,
keine doppelten Einträge. Ist das jetzt extremst eindeutig?
Ja.
Ah, jetzt verstejhe ich doch "eindeutig, d.h. möglichst wenige DS
zurückgeben, was?
Wenige Treffer sind besser als viele - aber "eindeutig" bedeutet
"genau ein Treffer". Das ist die Voraussetzung für einen Primär-
schlüssel. Und Primärschlüssel sind die bestmöglichen Schlüssel,
weil sie die kleinstmöglichen Treffermengen liefern.
Was die Reihenfolge des Paares angeht, müßte ich wissen,
welche der beiden Spalten eindeutigere Treffer liefert -
diese sollte innerhalb dieses Paares vorne sein.
Also PLZ - natürlich gibt es mehr PLZ als Bundesländer :-)
Bingo.
Die Abfrage sieht etwas so aus:
SELECT * FROM blz
WHERE BLZ='$blz'
AND (Ort Like '%$begriff_1%'
OR Ort Like '%$begriff_2%'
OR Bezeichnung Like '%$begriff_1%'
OR Bezeichnung Like '%$begriff_2%')
Wenn Du eine '%'-wildcard links in einem LIKE hast, dann hast Du
verloren. Kein Index ist in diesem Falle nutzbar - nur noch ein
full table scan.
Wenn Du _das_ schnell bekommen willst, hilft m. E. nur eine sehr
heftige Holzhammermethode: Generiere _alle_ substrings von "Ort"
und baue eine separate Tabelle damit, welche Substrings nach
Primärschlüsseln von "blz" übersetzt.
Über diese Substrings kannst Du einen Index legen - _diese_ Zu-
griffe werden schnell, und wenn die Treffermenge klein wird, dann
ist der JOIN mit "blz" auch schnell.
Nach dem Schema will ich einen vom Benutzer eingegebene Wert auf
Plausibilität überbrüfen, aber ich weiß genau das das so nicht gut
ist:-)
Gut erkannt.
Ich denke hier sollte ich einen Index über 'BLZ,Ort,Bezeichnung'
erstellen, oder? Oder sollte ich hier lieber mit Fulltext arbeiten?
FULLTEXT speichert nur Worte. In mySQL 3 kannst Du damit keine
substrings suchen - in mySQL 4 soll das gehen, habe ich gehört.
Mein Problem ist halt, das der USer wahrscheinlich sowas wie
'SPK Wuppertal' eingibt, oder 'Sparkasse W' oder was da alles
möglich ist, und in einem gewissen Rahmen sollen diese Sachen
erkannt werden, daher spalte ich den String "SPK Wuppertal" beim
Leerzeichen auf und durchsuche die 2 Spalten einzelnd nach allen
Begriffen.
Gute Idee. Ich mache das sehr ähnlich. Du mußt allerdings damit
leben, daß FULLTEXT einige Einschränkungen hat - beispielsweise
eine Mindestlänge von Worten.
Diese läßt sich allerdings im Quelltext des myISAM-Treibers ganz
leicht ändern - danach mySQL neu übersetzen und es läuft.
Viele Grüße
Michael