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.