Hi Michael!
Erstmal vielen Dank für die Erklährung und auch für die weiter unten, war noch nicht dazu gekommen zu antworten.
Verstehe ich nicht. Ich benutze doch keine Indizes?!
Solltest Du aber.
Also einfach in PHPmyAdmin "index" anklicken, bei den Felder die nacher durchsicht werden sollen? Aber bei der Suche(select...) muß ich da doch nichts ändern, oder durchsucht man mi indices anders, außer das man das Wort am Anfang stehen haben sollte?
Stell Dir vor, Du hast eine Million Datensätze. Jede Deiner beiden Suchanfragen muß dann also eine Million Vergleiche durchführen. Das ist nicht wirklich beliebig schnell.
Von einer Mio bin ich aber weit entfernt, sind bis jetzt vielleich 1000!
Und jetzt denke Dir zum Vergleich einen Index hinzu, also einen binären Baum, welcher sämtliche Werte des zu vergleichenden Feldes enthält. Wie findest Du (genauer gesagt: die SQL engine) darin einen Wert? Durch fortgesetzte Halbierung der Datenmenge, d. h. durch Absteigen in diesem Baum. Wieviele Schritte sind dafür notwendig? So viele, wie der Baum 'hoch' ist - im idealen Fall also Logarithmus zur Basis 2 von einer Million, also etwa 20. Und daß 20 Vergleiche schneller sind als eine Million, darüber sind wir uns doch einig, ja?
Denke das kann ich nur schwer widerlegen:-)
Genau diese Baum-Halbierungs-Methode funkioniert aber nur dann, wenn Du Suchbegriff auf den Anfang der gespeicherten Worte anwenden kannst - deshalb darf die wildcard nicht am Anfang vorliegen, sonst geht wiederum nur der lineare Vergleich aller Datensätze.
Warum 'Halbierung', hörte sich gerade wie 1.000.000/x = 20 ?
Aber wenn das Suchwort irgendwo im Text vorkommen kann, muß ich das
wohl so machen, oder geht das auch anders?
Das kommt darauf an, wie Du Deinen Text gespeichert hast.
Wenn Dein gesamter Text ein Feld der Tabelle ist _und_ Du nichts anderes verwenden willst als Dein obiges Statement, dann droht Dir die "eine-Million-Vergleiche-Strafe".
Mit wieviel Jahren kann man denn bei 1 Mio so rechnen(wenn möglich auf Sekunden umgerechnet:)?
- Du speicherst in einer weiteren Tabelle sämtliche Worte Deines Textes, je ein Wort pro Zeile, und als zweite Spalte den Primärschlüssel aus der ersten Tabelle. (Den Worte-Zerleger mußt Du Dir natürlich selbst schreiben.)
Nun kannst Du in der zweiten Tabelle Worte suchen und zu jedem Treffer aus der ersten Tabelle das zugehörige Dokument finden.
Und solange Du Dich auf Worte beschränkst (im Gegensatz zu Phrasen, also beliebigen Text-Teilen inklusive Wort-Trennern), kommst Du mit diesem Modell prima aus - und für eine exakte Übereinstimmung zwischen Deinem Suchbegriff und einem einzelnen Wort kannst Du wiederum den Index über die Worte-Spalte der zweiten Tabelle nutzen (das macht die Datenbank von alleine, Du mußt den Indexe einfach nur anlegen, gefüllt wird er beim Einfügen Deiner Worte in die Tabelle).
Nun ja, denke das würde ich hinbekommen, aber was wird das dann für eine krasse Tabelle, wenn die erste 1 Mio Datensätze hat, wird das hier ja langsam ziemlich viel! Außerdem werden die Datensätze je oft geändert und neue hinzugefügt, das müßte ich dann jedesmal mit ändern!
- Du überläßt es mySQL, sich mit dem Problem zu befassen.
mySQL hat seit Version 3.23.23 eine eingebaute Volltextsuche! Lies Dir mal das Kapitel über FULLTEXT-Indexe durch ...
Das wäre natürlich das beste! Wie ist das mit der Performance?
Grüße
Andreas