139 votes

Est-il un gain de performance lors de l'indexation d'un champ booléen?

Je suis juste sur le point d'écrire une requête qui inclut une WHERE isok=1. Comme son nom l'indique, isok est un champ booléen (en fait, TINYINT(1) UNSIGNED qui est mis à 0 ou 1, si nécessaire).

Est-il un gain de performance à l'indexation de ce champ? Serait le moteur InnoDB dans ce cas) effectuer le meilleur ou pour le pire recherche de l'index?

159voto

oucil Points 458

Juste pour mettre une fine point sur plusieurs autres réponses ici, étant donné que dans mon expérience, ceux qui cherchent à des questions de ce genre sont dans le même bateau, nous étions, nous avons tous entendu que l'indexation des champs Booléens est inutile, et pourtant...

Nous avons une table avec environ 4 millions de lignes, seulement environ 1000 à l'heure d'un commutateur Booléen marqué et c'est ce que l'on recherche contre. L'ajout d'un index sur notre champ Booléen accéléré des requêtes par des ordres de grandeur, il est passé d'environ 9 secondes pour une fraction de seconde.

101voto

Michael Koper Points 3507

Pas vraiment..... Vous devez penser comme un livre. Si il n'y aurait que 3 types de mots dans un livre et l'index de tous, vous avez la même quantité de pages de l'index de pages normales.

Il aurait un performmance gain si vous avez le booléen relativement peu de dossiers d'une valeur. Par exemple, si vous avez 1000 enregistrements et 10 d'entre elles sont VRAIES. Qu'il serait utile que si vous recherche avec isok = 1

Comme Michael Durrant mentionné, il rend également écrit plus lent.

EDIT: trouvé un possible duplications:

L'indexation des champs booléens

Ici, il explaims que même si vous avez un index. Si vous avez trop de dossiers, il ne marche pas, utilisez l'index de toute façon. MySQL et non pas à l'aide de l'index lors de la vérification = 1 , mais en l'utilisant avec = 0

39voto

ypercube Points 62714

Cela dépend de la requêtes et la sélectivité de l'index/la requête de la combinaison.

Cas A: l'état d' WHERE isok = 1 et rien d'autre là-bas:

SELECT *
FROM tableX
WHERE isok = 1
  • Si l'indice est suffisamment sélectif (dire que vous avez 1M de lignes et seulement 1k ont isok = 1), puis le moteur SQL sera probablement utiliser l'index et être plus rapide que sans elle.

  • Si l'index n'est pas suffisamment sélectif (dire que vous avez 1M de lignes et plus de 100k ont isok = 1), puis le moteur SQL ne sera probablement pas utiliser l'index et de faire une analyse de la table.

Cas B: l'état d' WHERE isok = 1 et plus de choses:

SELECT *
FROM tableX
WHERE isok = 1
  AND another_column = 17

Ensuite, cela dépend de ce que d'autres indices que vous avez. Un index sur another_column serait probablement plus sélectif que l'indice isok qui n'a que deux valeurs possibles. Un index sur (another_column, isok) ou (isok, another_column) serait encore mieux.

5voto

Michael Durrant Points 30342

Non, généralement pas.

Vous habituellement les champs d'index pour la recherche quand ils ont une haute sélectivité/cardinalité. Un champ booléen de la cardinalité est très faible dans la plupart des tableaux. Il serait également rendre votre écrit tout petit peu plus lent.

0voto

ilanco Points 3980

Oui un index pour améliorer les performances, vérifiez la sortie de l'EXPLIQUER avec et sans index.

À partir de la documentation:

Les index sont utilisés pour trouver des lignes spécifiques des valeurs de la colonne rapidement. Sans index, MySQL doit commencer avec la première ligne, puis de lire à travers l'ensemble de la table pour trouver les lignes pertinentes. Le plus grand de la table, plus cela coûte. Si la table dispose d'un index pour les colonnes en question, MySQL peut déterminer rapidement la position de chercher à dans le milieu du fichier de données sans avoir à regarder toutes les données.

Je pense qu'il est également sûr de dire un indice de la volonté de ne pas DIMINUER les performances dans ce cas, vous n'avez qu'à y gagner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X