Mysql
 sql >> Datenbank >  >> RDS >> Mysql

REGEXP-Leistung (vergleiche mit LIKE und =)

In Bezug auf reguläre Ausdrücke

Der reguläre Ausdruck kann nie Verwenden Sie einen Index in MySQL.
Der = verwendet einen Index, wenn:

  • ein Index wird für die Spalte deklariert;
  • die Werte in der Spalte haben eine ausreichende Kardinalität (wenn mehr als +/- 20 % der Zeilen übereinstimmen, verwendet MySQL keinen Index, da in diesem Fall ein vollständiger Tabellenscan schneller ist). );
  • Keine anderen Indizes für dieselbe Tabelle sind besser geeignet (MySQL kann nur einen Index pro Tabelle und Unterauswahl verwenden);

In Anbetracht dieser und einiger anderer esoterischer Vorbehalte ein = Vergleich ist viel schneller als ein regulärer Ausdruck.

Apropos wie

LIKE kann einen Index verwenden, wenn der Platzhalter nicht das erste Zeichen ist.

SELECT * FROM t WHERE a LIKE 'abc'   <<-- (case insensitive `=`) can use an index
SELECT * FROM t WHERE a LIKE 'abc%'  <<-- can use an index
SELECT * FROM t WHERE a LIKE 'a%'    <<-- can use an index, depending on cardinality
SELECT * FROM t WHERE a LIKE '%a%'   <<-- cannot use an index
SELECT * FROM t WHERE a LIKE '_agf'  <<-- cannot use an index

Die Leistung von like bei Verwendung eines Index ist sehr nah an = (unter der Annahme, dass dieselbe Anzahl von Zeilen zurückgegeben wird).