mixmastertobsi: MySQL LIKE oder REGEXP

Hallo,

sollte man grundsätzlich immer LIKE bei MYSQL vorziehen, oder wann nutze ich REGEXP.

Ich habe eine Abfrage, bei welcher ich mehrere LIKE Parameter hintereinander stelle, was allerdings sehr unübersichtlich aussieht. Mit REGEXP wäre es wesentlich üb ersichtlicher.

produkt LIKE '% $value %' OR produkt LIKE '$value %' OR produkt LIKE '% $value' OR produkt='$value'
produkt REGEXP '\ $value\ |^$value\ |\ $value$|^$value$'
  1. Tach!

    sollte man grundsätzlich immer LIKE bei MYSQL vorziehen, oder wann nutze ich REGEXP.

    Es gibt kein "grundsätzlich" bei solchen Fragen. Es ist eine Abwägung zwischen Ausführungsgeschwindigkeit und Wartungsfreundlichkeit. Wobei die Geschwindigkeit auch noch vom Datenbestand abhängig sein kann.

    dedlfix.

  2. Hello,

    produkt LIKE '% $value %' OR produkt LIKE '$value %' OR produkt LIKE '% $value' OR produkt='$value'
    

    Erst einmal solltest Du die Reihenfolge anpassen, damit der Optimizer einen Index benutzen kann. Der sollte selbstverständlich angelegt sein.

    Also zuerst nach absoluter Übereinstimmung suchen lassen und dann erst die Ausnahmefälle behandeln. Außerdem könnest Du dann vorher noch eine Trimmung vornehmen, ggf. auch auch beiden Seiten. Da musst Du nun mal selber überlegen.

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. helo,

      Erst einmal solltest Du die Reihenfolge anpassen, damit der Optimizer einen Index benutzen kann.

      Greift der überhaupt bei like? MfG

      @OP: Guck daß Dir keine SQL Injektionen untergeschoben werden können.

      1. Hallo pl,

        wenn ich per LIKE auf einem Feld operiere, das im Index steht, kann die DB einen Index-Scan statt eines Table-Scan machen. Und wenn nur am Ende ein % steht, kann sie sogar mit einem Seek beginnen.

        Ersteres kann der Optimizer in der Prepare-Phase feststellen, letzteres erst bei Query-Ausführung. Ob er sich die Mühe macht, oder ob er aus anderen Gründen den Index ignoriert, kann man schlecht vorausagen.

        Das hängt von den DB-Statistiken ab, d.h. wenn man für die Query auf der kleinen Test-DB einen Explain macht, sagt er ggf. "Table-Scan" (weil er die paar Sätze in einem Happs in den RAM laden kann), während er sich auf der tausendmal so großen Produktions-DB dann doch zum Index bequemt.

        Rolf

        --
        sumpsi - posui - clusi
        1. Danke für die Info! VfG

        2. wenn ich per LIKE auf einem Feld operiere, das im Index steht, kann die DB einen Index-Scan statt eines Table-Scan machen.

          Ja. Und wenn die Tabelle nur klein genug ist, dann ist der Zugriff auf einen Index sogar völlig verzichtbar...

          Mit EXPLAIN SELECT … stehen Informationen zum tatsächlichen Verhalten zur Verfügung.

          Aus dem Handbuch für MySQL 5.7

          The following SELECT statements do not use indexes:

          SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
          SELECT * FROM tbl_name WHERE key_col LIKE other_col;
          

          Noch Fragen?

  3. sollte man grundsätzlich immer LIKE bei MYSQL vorziehen, oder wann nutze ich REGEXP.

    Da gäbe es noch die MySQL Volltextsuche welche ich bei größeren Tabellen und Suchen nach Wörtern wenn möglich vorziehen würde.

    Es gibt auch eine boolesche Variante.

     SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
     // AND cond2 ....
    

    Sogar mit einem Joker, der aber aus Indexierungs- Performancegründen nur an das Wort angestellt werden kann.

    Was LIKE, REGEXP und die Frage ob ein Index - sofern vorhanden - auch verwendet wird. Wie schon erwähnt wurde, explain nutzen. In der Regel kann ein Index nur bei hinten angestelltem Joker verwendet werden z.B. LIKE 'value%bar%' oder REGEXP 'value.*bar' nicht aber etwa bei %value oder [a-z]+value. Eventuell hat sich da etwas bei neuen MySQL Versionen geändert.

    Sobald eine OR Verknüpfung mit einem %foo (voangestelltem Joker) vorhanden ist, würde es meines Erachtens immer in einem full table scan enden / sprich kein Index verwendet werden können.

    Wenn die Tabelle nur ein paar tausend Datensätze enthält und der Server halbwegs flott, kann man sicherlich auch auf die Verwendung eines Index verzichten. Muss man halt abwägen.