Met betrekking tot regexp
De regexp kan nooit gebruik een index in MySQL.
De =
zal een index gebruiken als:
- een index wordt gedeclareerd in de kolom;
- de waarden in de kolom hebben voldoende kardinaliteit (als meer dan +/- 20% van de rijen overeenkomen, zal MySQL geen index gebruiken, omdat in dat geval een volledige tabelscan sneller is) );
- Geen andere indexen in dezelfde tabel zijn beter geschikt (MySQL kan slechts één index per tabel per subselectie gebruiken);
Gezien deze en enkele andere, meer esoterische voorbehouden, is een =
vergelijking is veel sneller dan een regexp.
Wat betreft like
LIKE kan een index gebruiken als het jokerteken niet het eerste teken is.
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
De prestaties van like
bij gebruik van een index ligt deze zeer dicht bij =
(ervan uitgaande dat hetzelfde aantal rijen wordt geretourneerd).