Maison > base de données > tutoriel mysql > Quel index MySQL est le plus efficace pour les requêtes par plage : en tête avec une colonne de cardinalité élevée ou faible ?

Quel index MySQL est le plus efficace pour les requêtes par plage : en tête avec une colonne de cardinalité élevée ou faible ?

Barbara Streisand
Libérer: 2024-11-29 02:55:14
original
596 Les gens l'ont consulté

Which MySQL Index Is More Efficient for Range Queries: Leading with High or Low Cardinality Column?

Optimisation d'index pour les requêtes de plage

Les colonnes avec une cardinalité plus élevée contribuent à des index plus efficaces dans MySQL. Cependant, dans le cas de requêtes par plage, une exception s'applique.

Énoncé du problème

Considérons un tableau avec la structure suivante :

CREATE TABLE `files` (
  `did` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `filename` VARBINARY(200) NOT NULL,
  `ext` VARBINARY(5) DEFAULT NULL,
  `fsize` DOUBLE DEFAULT NULL,
  `filetime` DATETIME DEFAULT NULL,
  PRIMARY KEY (`did`,`filename`),
  KEY `fe` (`filetime`,`ext`),          -- Option 1
  KEY `ef` (`ext`,`filetime`)           -- Option 2
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Copier après la connexion

Les durées de fichier sont distinctes, alors qu'il existe un nombre limité de valeurs ext (c'est-à-dire une cardinalité plus élevée pour la durée du fichier, une cardinalité inférieure pour ext). Une requête implique les deux colonnes avec les conditions suivantes :

WHERE ext = '...'
AND filetime BETWEEN ... AND ...
Copier après la connexion

Quel index, fe ou ef, est le plus optimal ?

Réponse

Étonnamment , l'index avec ext comme première colonne, malgré sa cardinalité plus faible, est plus efficace pour cela requête.

Explication

L'optimiseur de MySQL analyse les alternatives d'index et choisit celle avec le coût le plus bas. En utilisant la trace de l'optimiseur, nous pouvons observer le raisonnement derrière ce choix.

Pour fe (filetime en premier), MySQL estime qu'il lui faudrait analyser 16684 lignes pour trouver les fichiers 'gif', même avec la condition de plage activée. filetime.

Pour ef (ext first), cependant, il estime qu'il peut utiliser les deux colonnes d'index et accéder rapidement aux lignes appropriées, ce qui entraîne un coût de seulement 646.61. MySQL choisit cet index car il peut utiliser plus d'éléments clés, ce qui rend la recherche plus efficace.

Conclusions

  • Donner la priorité aux colonnes impliquées dans les tests d'égalité dans l'index, quelle que soit la cardinalité.
  • Le plan de requête ne s'étendra pas au-delà de la première colonne « plage ».
  • Dans ce Dans le contexte, la cardinalité n'est pas pertinente pour les index composites et les requêtes de plage.
  • InnoDB peut utiliser des colonnes d'index au-delà de celles utilisées pour le filtrage ("Utilisation de la condition d'index").

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal