2010-04-29 5 views
21

Gerücht hat es, dass dies:Leistung von RegEx vs LIKE in MySQL-Abfragen

SELECT * FROM lineage_string where lineage like '%179%' and lineage regexp '(^|/)179(/|$)' 

als dies schneller sein würde:

SELECT * FROM lineage_string where lineage regexp '(^|/)179(/|$)' 

Kann jemand bestätigen? Oder Sie kennen einen guten Weg, um die Geschwindigkeit solcher Anfragen zu testen. Danke

+0

Laut dieser schlecht unterstützten Blogpost war LIKE 10x schneller als REGEXP (Daten können variieren, kein Wort zur Indexnutzung, etc): http://thingsilearn.wordpress.com/2008/02/28/mysql-query -speed-regexp-vs-like/ –

+0

Zusätzlicher Link - gleiche Geschichte, LIKE ist schneller: http://lists.mysql.com/mysql/101728 –

+0

Es war definitiv schneller für 'TEXT' und' VARCHAR' Felder Ich habe es versucht auf. Ich erinnere mich daran, in einem Blog-Kommentar gelesen zu haben, dass ** REGEXP ** schneller ist als ** LIKE ** für "UNSIGNED" -Felder, aber das kann ich nicht bestätigen. – inhan

Antwort

21

Es ist möglich, dass es schneller sein könnte, da die LIKE-Bedingung schneller als der reguläre Ausdruck ausgewertet werden kann. Wenn also die meisten Zeilen den Test nicht bestehen, könnte es schneller sein. Es wird jedoch langsamer, wenn die meisten Zeilen erfolgreich sind, da für erfolgreiche Zeilen zwei Tests ausgeführt werden müssen und nicht nur einer. Es hängt auch davon ab, welchen Ausdruck der Optimierer zuerst wählt.

SELECT * FROM (
    SELECT * FROM lineage_string 
    WHERE lineage LIKE '179%' 
) WHERE lineage regexp '^179(/|$)' 

Nun kann ein Index, weil ‚179%‘ sargable ist wie wahrscheinlich Zeilen finden verwendet werden:

Ein noch größeres Speedup können, wenn Sie etwas davon haben erlebt werden. Viele Zeilen müssen überhaupt nicht überprüft werden.

Wie immer ist der beste Weg, um sicher zu sein, es für Ihre tatsächlichen Daten zu messen.

13

Ja, es wäre wahrscheinlich ein kleines wenig schneller sein, weil Standard-SQL LIKE eine einfachere Vergleichsoperation als ein voll-auf regex-Parser ist.

In Wirklichkeit sind beide jedoch wirklich langsam, weil keiner Indizes verwenden kann. (LIKE können einen Index verwenden, wenn der Matchstring nicht mit einer Wildcard startet, aber das ist hier nicht der Fall.)

Wenn Sie über die Geschwindigkeit betrifft, so sollten Sie Ihr Schema ändern, damit Sie die 179 setzen können direkt in einer Spalte und indizieren Sie es, anstatt manuell in jeder Zeile nach einer Zeichenfolge suchen zu müssen.