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

Optimisation MySQL pour REGEXP

Si vous devez utiliser le style d'expression régulière WHERE clauses, vous serez certainement en proie à des problèmes de requête lente. Pour que la recherche de style regexp fonctionne, MySQL doit comparer chaque valeur de votre colonne de nom avec l'expression régulière. Et, votre requête a doublé le problème en regardant également votre colonne de nom d'utilisateur.

Cela signifie que MySQL ne peut tirer parti d'aucun index, c'est ainsi que tous les SGBD accélèrent les requêtes de grandes tables.

Il y a quelques choses que vous pouvez essayer. Tous impliquent de dire au revoir à REGEXP.

L'un est celui-ci :

WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')

Si vous créez des index sur vos colonnes de nom et de nom d'utilisateur, cela devrait être assez rapide. Il recherchera tous les noms/noms d'utilisateur commençant par 'jack'. AVIS que

WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */

recherchera les noms se terminant par 'jack' mais sera lent comme votre recherche de style regexp.

Une autre chose que vous pouvez faire est de comprendre pourquoi votre application doit pouvoir rechercher une partie d'un nom ou d'un nom d'utilisateur. Vous pouvez soit éliminer cette fonctionnalité de votre application, soit trouver une meilleure façon de la gérer.

Meilleures façons possibles :

  1. Demandez à vos utilisateurs de diviser leurs noms en champs de prénom et de nom de famille, et de rechercher séparément.
  2. Créez une fonctionnalité distincte "rechercher tous les utilisateurs" qui n'est utilisée que lorsqu'un utilisateur en a besoin, réduisant ainsi la fréquence de votre requête lente de type regexp.
  3. Décomposez vous-même leurs noms dans une table de mots-noms distincte en utilisant une sorte de programme de prétraitement. Rechercher dans le tableau nom-mots sans regexp.
  4. Comment utiliser la recherche en texte intégral MySQL pour cette fonctionnalité.

Tout cela implique un travail de programmation.