Angående regexp
Regexp kan aldrig använd ett index i MySQL.=
kommer att använda ett index om:
- ett index deklareras i kolumnen;
- värdena i kolumnen har tillräcklig kardinalitet (om mer än +/- 20 % av raderna matchar kommer MySQL inte att använda ett index, eftersom det i så fall är snabbare att göra en fullständig tabellsökning );
- Inga andra index på samma tabell är bättre lämpade (MySQL kan bara använda ett index per tabell per delval);
Med tanke på dessa och några andra mer esoteriska varningar är en =
jämförelse är mycket snabbare än ett regexp.
Angående liknande
LIKE kan använda ett index om jokertecknet inte är det första tecknet.
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
Prestanda för like
när du använder ett index är mycket nära =
(förutsatt att samma antal returnerade rader).