2010-04-29 41 views
21

Los rumores dicen que esto:Rendimiento de RegEx vs LIKE en consultas de MySQL

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

sería más rápido que esto:

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

Alguien puede confirmar? O conozca una forma decente de probar la velocidad de tales consultas. Gracias

+0

De acuerdo con esta publicación de blog mal soportada, LIKE fue 10 veces más rápido que REGEXP (los datos pueden variar, no hay palabras sobre el uso del índice, etc.): http://thingsilearn.wordpress.com/2008/02/28/mysql-query -speed-regexp-vs-like/ –

+0

Enlace adicional: la misma historia, LIKE es más rápido: http://lists.mysql.com/mysql/101728 –

+0

Definitivamente fue más rápido para los campos 'TEXT' y' VARCHAR' Lo probé en. Recuerdo haber leído en un blog que ** REGEXP ** es más rápido que ** LIKE ** para los campos 'UNSIGNED', pero no puedo confirmarlo. – inhan

Respuesta

21

Es posible que pueda ser más rápido porque la condición LIKE se puede evaluar más rápidamente que la expresión regular, por lo que si la mayoría de las filas fallan, la prueba podría ser más rápida. Sin embargo, será más lento si la mayoría de las filas tienen éxito ya que se deben ejecutar dos pruebas para las filas exitosas en lugar de solo una. También depende de qué expresión el optimizador elija ejecutar primero.

una aceleración aún más grande puede ser testigo si tiene algo como esto:

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

Ahora un índice puede ser usado para encontrar posibles filas porque como '179%' es sargable. Muchas filas no necesitarán ser revisadas en absoluto.

Como siempre, la mejor manera de estar seguro es midiéndolo usted mismo con sus datos reales.

13

Sí, probablemente sería un poco más rápido porque el estándar-SQL LIKE es una operación de comparación más simple que un analizador de expresiones regex full-on.

Sin embargo, en términos reales ambos son muy lentos, porque ninguno puede usar índices. (LIKE puede usar un índice si la cadena de búsqueda no se inicia con un comodín, pero ese no es el caso aquí.)

Si usted está preocupado acerca de la velocidad, se debe cambiar el esquema de modo que usted puede poner el 179 directamente en una columna e indexarlo, en lugar de tener que verificar manualmente una cadena en cada fila.

Cuestiones relacionadas