Michael Schröpl: MySQL: Performaceproblem

Beitrag lesen

Hi Andreas,

Dann ist aber "eindeutiger" ein Wort was es nicht
geben dürfte :-)

Yep. Streiche "eindeutiger", setze "selektiver" oder
"besser projezierend".

Ist der Primärschlüssel auch ein Index?
Alo wen man den definiert hat man damit auch einen
Index über diese Spalte?

Ja, ein PRIMARY KEY impliziert einen UNIQUE INDEX.
(Wie anders würdest Du denn performant prüfen wollen,
daß dort nur eindeutige Werte drin stehen? ;-)

Wenn Du sagst man könnte keine Substrings suchen,
wie meinst Du das genau?

Wenn Du nach "Chrysler" suchst, findest Du "DaimlerChrysler" nicht (FULLTEXT in mySQL 3.x).

Konnte man bei Fulltext überhaupt mehrere Suchwörter
angeben?

Nein. Aber Du kannst mehrere MATCH-Klauseln mit AND
verknüpfen. Wenn jeder Match hinreichend selektiv ist, dann ist das Ausmultiplizieren der Treffermengen nicht mehr arg teuer.
Eine Phrasensuche nach "Hallo Andreas" in der Spalte x könntest Du durch
   SELECT * FROM <tablename>
    WHERE MATCH (X) AGAINST "hallo"
      AND MATCH (X) AGAINST "andreas"
      AND X LIKE "%hallo andreas%";
realisieren. mySQL nimmt dann zuerst den FULLTEXT-Index und führt das LIKE nur auf die Treffer der vorherigen MATCHes durch - das kann sehr schnell werden, wenn die Suchbegriffe gut genug sind. (Sind sie extrem unterschiedlich gut, dann kann es sogar schneller sein, einige von ihnen wegzulassen - "Andreas" ist wahrscheinlich erheblich selektiver als "Hallo".)

Das ist das Modell, nach dem ich gerade selbst eine Suchmaschine gebaut habe.

Viele Grüße
      Michael