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).