Mysql
 sql >> Base de données >  >> RDS >> Mysql

Performances REGEXP (comparer avec LIKE et =)

Concernant l'expression régulière

L'expression rationnelle ne peut jamais utiliser un index dans MySQL.
Le = utilisera un index si :

  • un index est déclaré sur la colonne ;
  • les valeurs de la colonne ont une cardinalité suffisante (si plus de +/- 20 % des lignes correspondent, MySQL n'utilisera pas d'index, car dans ce cas, effectuer une analyse complète de la table est plus rapide );
  • Aucun autre index sur la même table n'est mieux adapté (MySQL ne peut utiliser qu'un seul index par table par sous-sélection) ;

Compte tenu de ces mises en garde et de quelques autres mises en garde plus ésotériques, un = la comparaison est beaucoup plus rapide qu'une expression rationnelle.

Concernant comme

LIKE peut utiliser un index si le caractère générique n'est pas le premier caractère.

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

Les performances de like lors de l'utilisation d'un index est très proche de = (en supposant que le même nombre de lignes renvoyées).