Harald: MySQL und Performance bei Wildcards-Suche

So nach 3 mal reloaden habe ich es doch noch bis ans Ende geschafft...

Hallo!

Ich wollte mal fragen, ob jemand von euch schon mal Erfahrungen mit MySQL und Wildcards-Suche gemacht hat. Ich habe eine Tabelle von MSAccess nach MySQL portiert (ca. 500.000 Datensaetze) und muss in einer Varchar-Spalte mit Wildcards nach bestimmten Woertern suchen. Leider ist MySQL dabei sehr viel langsamer als MSAccess. Indizieren bringt dabei nichts, weil im Suchbegriff vorne und hinten ein '%' gebraucht wird. Kennt jemand andere Tricks, mit denen man die Suche beschleunigen kann?

Liebe Gruesse

Harald

  1. Hallo Harald,

    mit einem Wildcard vorn ist immer schlecht (bei meinem Provider hat es damit jemand geschafft, regelmäßig den db-server zu crashen...). Eine gewisse Performancesteigerung kannst Du erreichen, wenn Du statt varchar char nimmst (nachdem bei char die Länge festgelegt ist, kann MySQL damit sehr viel einfacher einen Datensatz finden, funktioniert allerdings nur, wenn in der Tabelle nur chars sind, keine varchars oder blobs)

    Viele Grüße
    Stephan

  2. Hi,

    Indizieren bringt dabei nichts, weil im Suchbegriff vorne und hinten ein '%' gebraucht wird.

    Nicht, wenn Du Dein SQL-Statement nicht ebenfalls änderst, das ist wahr.

    Kennt jemand andere Tricks, mit denen man die Suche beschleunigen kann?

    Wie hoch sind Deine Performance-Ansprüche?
    Wie viel Speicherplatz steht Dir zur Verfügung?

    Ressourcen sind austauschbar. Du könntest folgendes tun:
    1. Nur noch *exakte* Suchvorgänge durchführen.
    2. Aber in einer Tabelle, welche jedes Teilwort (!) Deiner eigentlichen Tabelleninhalte enthält (und einen Verweis auf den dadurch teil-beschriebenen Tabellenwert).
    Ja, das sind *exponentiell* viele Tabellenwerte - deshalb die Frage weiter oben.
    Aber es geht dann auch logarithmisch schnell, weil Du *jetzt* Gebrauch von einem Index machen kannst.

    mfG - Michael

    1. Hallo!

      also, als performance erwarte ich mir eine antwortzeit von unter 5 sekunden bei wie gesagt 500000 eintraegen. allerdings muessen in diese zeit auch noch einige joins reinpassen :-) frueher mit MSAccess bzw SQL Server 7 ging das. MySql tut sich seltsamerweise ziemlich schwer, was ich nicht ganz verstehe, weil MySql doch so fuer seine geschwindigkeit gelobt wird. aber das gilt wohl nur, wenn man einen index verwenden kann. auch bei groesseren (self-)joins tut es sich ziemlich schwer.
      als hardware hab ich einen P2 350 mit 128MB. mit dieser hardware sind die anderen datenbanken aber auch ausgekommen...
      alle moeglichen substrings von 500000 eintraegen... das muss ich mir mal in einer ruhigen minute ausrechnen... :-)

      danke fuer die tips!

      liebe gruesse

      harald

  3. wenn ich ehrlich bin habe ich nicht besonders viel Erfahrung mit MySQL.. ich arbeite immer mit nem MSSQL7.0 .. auf jeden fall hat man da die Möglichkeit, sogenannte Volltextindizes zu definieren.. da geht das dann super schnell.. vieleicht gibts sowas ja auch beim MySQL!

    1. hallo!

      leider gibt es sowas nicht. meines wissens nach kann die volltextsuche aber auch keine kompletten wildcards sondern nur solche am ende des wortes, wobei man dann wieder mit deinem index arbeiten kann. ausserdem geht ein volltextindex nur auf eine spalte einer tabelle. aber damit koennte man leben. aber wie auch immer, mysql kennt sowas garnicht. *sniff*

      liebe gruesse

      harald