Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Desempenho REGEXP (compare com LIKE e =)


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