Em relação à regexp
O regexp pode nunca use um índice no MySQL.
O
=
usará um índice se:- um índice é declarado na coluna;
- os valores na coluna têm cardinalidade suficiente (se mais de +/- 20% das linhas corresponderem, o MySQL não usará um índice, porque nesse caso fazer uma verificação completa da tabela é mais rápido );
- Nenhum outro índice na mesma tabela é mais adequado (o MySQL pode usar apenas um índice por tabela por subseleção);
Considerando essas e algumas outras advertências mais esotéricas, um
=
comparação é muito mais rápido que um regexp. Em relação a
LIKE pode usar um índice se o curinga não for o primeiro caractere.
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
O desempenho de
like
ao usar um índice é muito próximo de =
(assumindo o mesmo número de linhas retornadas).