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

Optimisation de la requête MySQL du terme LIKE% ORDER BY int

Vous avez posé une autre question "Création d'un index qui convient le mieux à la recherche de caractères génériques dans 40 millions de noms". D'accord, vous avez 40 millions d'enregistrements.

Considérons maintenant la formule suivante :

x = COUNT(DISTINCT values in a column) / COUNT(values in a column)

Un index sur une colonne est d'autant mieux, plus x est proche est à 1. Si c'est 1, toutes les valeurs sont distinctes, il n'y a pas de doublons et un index est donc assez rapide.

Maintenant, vous cherchez 'john%'. C'est 4 lettres et une extrémité ouverte. Quelles lettres n'ont pas d'importance, votre base de données doit gérer 26*26*26*26=456976 valeurs distinctes. Mettez cela dans la formule ci-dessus et vos 40 millions d'enregistrements. Vous obtenez un x de 0,0114244.

Je ne sais pas encore quel est le seuil, mais IIRC c'est 0,1 ou quelque chose comme ça. Donc, si vous êtes x est supérieur à 0,1 l'indice est utilisé, s'il est inférieur, il ne l'est pas.

Pourquoi est-ce si? L'utilisation d'un index peut même ralentir les choses, car votre base de données doit regarder l'index, voir dans cet index à quelle position sur votre disque dur physique se trouve l'enregistrement approprié, puis obtenir cet enregistrement. Par conséquent, lorsque x est inférieur à 10 %, il est plus rapide de parcourir l'intégralité de la table.

Pour résumer :filtrer 40 millions d'enregistrements avec un seul index faible comme le vôtre est tout simplement inutile.