Angående regexp
Det regexp kan aldrig brug et indeks i MySQL.=
vil bruge et indeks, hvis:
- et indeks er erklæret på kolonnen;
- værdierne i kolonnen har tilstrækkelig kardinalitet (hvis mere end +/- 20 % af rækkerne matcher, vil MySQL ikke bruge et indeks, fordi det i så fald er hurtigere at foretage en fuld tabelscanning );
- Ingen andre indekser på samme tabel er bedre egnede (MySQL kan kun bruge ét indeks pr. tabel pr. undervalg);
I betragtning af disse og nogle andre mere esoteriske forbehold er en =
sammenligning er meget hurtigere end et regexp.
Angående lignende
LIKE kan bruge et indeks, hvis jokertegnet ikke er det første tegn.
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
Ydeevnen for like
når du bruger et indeks er meget tæt på =
(forudsat det samme antal returnerede rækker).