Andreas Dölling: Performance: REGEXP und MySQL

Hallo,

hat jemand von Euch konkrete Erfahrungen mit der Performance von SQL-Queries mit regulären Ausdrücken bei MySQL-Datenbanken?

Ich habe eine "unscharfe Suche" programmiert, die beispielsweise bei dem Suchbegriff "Meier" auch "Meyer" und "Maier" findet, und verwende dazu in den SELECT-Queries die REGEXP-Funktion.
Auf meinem lokalen Testserver läuft das wunderbar, auf dem Produktivserver allerdings geht die Performance in drastischer Weise in die Knie.
Der zu durchsuchende Datenbestand ist sehr überschaubar: 130 Datensätze, bei denen jeweils 3 Textfelder (je <= 150 Zeichen) durchsucht werden.
Daher bin ich erstaunt über den Einbruch auf dem Produktivserver (der allwerdings recht schwach auf der Brust ist).
Habt Ihr vielleicht Erfahrungen mit dem Einsatz regulärer Ausdrücke unter MySQL?

Leider sehe ich im Moment auch keine Möglichkeit, diese Funktionalität (unscharfe Suche) ohne reguläre Ausdrücke hinzubekommen. Oder habt Ihr da Tipps?

Thanx und ciao,
Andreas

  1. hi,

    Ich habe eine "unscharfe Suche" programmiert, die beispielsweise bei dem Suchbegriff "Meier" auch "Meyer" und "Maier" findet, und verwende dazu in den SELECT-Queries die REGEXP-Funktion.

    und mit was für einem ausdruck?

    Leider sehe ich im Moment auch keine Möglichkeit, diese Funktionalität (unscharfe Suche) ohne reguläre Ausdrücke hinzubekommen. Oder habt Ihr da Tipps?

    ggf. ließe sich da auch über vergleiche von teilzeichenketten mit SOUNDEX() was machen.

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
    1. Hallo,

      danke für Deine Antwort!

      und mit was für einem ausdruck?

      Es ist ein sehr simpler Ausdruck - so etwas in dieser Art:
      WHERE last_name REGEXP 'm((ä|ae|e|äh|aeh|eh)i|ai|(ä|ae|e|äh|aeh|eh)y|ay)(ä|ae|e|äh|aeh|eh)r'
      Dieser Ausdruck matcht "Maier", "Meier", "Meyer" etc.
      Sieht ein wenig aufgebläht aus, weil für das 'e' in der Variante 'ei' auch nach 'ä', 'ae' etc. gesucht wird usw.
      Wie gesagt, das ist ein sehr simpler Ausdruck, scheint mir aber das Richtige und Angemessene zu sein.

      ggf. ließe sich da auch über vergleiche von teilzeichenketten mit SOUNDEX() was machen.

      Hm, da gibt es Probleme, da soundex() auf die englische Sprache ausgerichtet ist. Zwei Kollegen von mir haben mit soundex() jedenfalls eher schlechte Erfahrungen gemacht.

      Ciao,
      Andreas

  2. 你好 Andreas,

    hat jemand von Euch konkrete Erfahrungen mit der Performance von
    SQL-Queries mit regulären Ausdrücken bei MySQL-Datenbanken?

    Tja, regulaere Ausdruecke sind aufwendig. Nicht zu aendern, sie kosten
    Rechenzeit. Dazu kommt, dass bei einem Regex-Match ein Full table scan
    gemacht werden muss, so dass der Rechenzeit auf jede Reihe angewandt werden
    muss. Das bedeutet, linearer Aufwand (O(n)). Wenn du wirklich einen RegEx
    brauchst, dann musst du dich damit abfinden, dass die Abfrage halt solange
    dauert. Eventuell wird es geringfuegig schneller, wenn du die glibc mal auf
    einen aktuellen Stand bringst (die nutzt MySQL dazu, regulaere Ausdruecke
    auszufuehren), aber wirklich viel wirst du da nicht rausholen koennen.

    Was den SOUNDEX()-Hinweis von wahsaga angeht: das ist auf englische Sprache
    optimiert, fuer deutsche Sprache kann das nur schwer verwendet werden.

    再见,
     CK

    --
    "Ich muss auflegen, mein Essen ist gleich fertig."
    "Oh, was gibt 's denn?"
    "Hmm. Die Packung liegt schon im Muell, keine Ahnung.
    http://wwwtech.de/