sql >> Base de Datos >  >> RDS >> Mysql

Rendimiento de REGEXP (comparar con LIKE y =)

Con respecto a las expresiones regulares

La expresión regular puede nunca use un índice en MySQL.
El = utilizará un índice si:

  • se declara un índice en la columna;
  • los valores en la columna tienen suficiente cardinalidad (si más del +/- 20% de las filas coinciden, MySQL no usará un índice, porque en ese caso hacer un escaneo completo de la tabla es más rápido );
  • Ningún otro índice en la misma tabla es más adecuado (MySQL solo puede usar un índice por tabla por subselección);

Teniendo en cuenta estas y algunas otras advertencias más esotéricas, un = la comparación es mucha más rápido que una expresión regular.

Con respecto a como

LIKE puede usar un índice si el comodín no es el primer carácter.

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

El rendimiento de like cuando se usa un índice está muy cerca de = (suponiendo que se devuelva el mismo número de filas).