2010-03-16 29 views
0

J'ai une question générale sur le fonctionnement de l'indexation de la base de données, en particulier dans mysql. Disons que j'ai une table avec un million de lignes avec une colonne "ClientID" qui est répartie de manière relativement égale parmi 30 valeurs. Ainsi, cette colonne est de cardinalité très basse (30) par rapport à la clé primaire (1 million).Question à propos des index mysql sur les colonnes de cardinalité basse à moyenne

Maintenant, je comprends que vous ne devriez pas créer d'index sur les champs à faible cardinalité. Toutefois, dans ce cas, les requêtes sont uniquement effectuées avec l'un des 30 clientsID. Ainsi, la création d'un index sur ClientID ne serait-elle pas utile, puisque l'espace de recherche est automatiquement réduit à 1/30ème de ce qu'il serait normalement? Ou est ma compréhension de la façon dont l'indice fonctionne imparfait?

Merci

Répondre

3

Ce que j'ai appris en règle empirique très générale des séminaires parrainés par MySQL J'ai assisté est que vous gagnez un certain niveau de bénéfice de la performance dans la plupart des cas où la cardinalité réduit votre espace de recherche de 80% ou plus. Cela semble tenir à peu près n'importe quelle configuration matérielle que j'ai rencontrée.

Cela ressemble à un index dont vous pourriez presque certainement bénéficier. Bien sûr, cela peut rapidement se décomposer sur une table d'écriture lourde où l'index doit constamment être ajusté. Dans d'autres circonstances, la réponse correcte est vraiment «ça dépend», et l'analyse comparative est généralement la voie à suivre.

Vous pouvez également vérifier la fonction dans une base MySQL BENCHMARK() - ce n'est pas parfait, mais peut aider dans les choses de test comme celui-ci: http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_benchmark

+1

Ainsi, l'OP devrait indexer, étant donné que 1/30 est une réduction de (très) environ 95%? – lexu

+0

Correct. Un exemple de champ POUVANT être mauvais à indexer serait un TINYINT (1) utilisé comme un indicateur booléen. Naturellement, vos questions importent beaucoup ici et votre «pénalité» peut aller de l'espace disque gaspillé aux temps de recherche terribles - EXPLAIN est votre ami ici :) – AvatarKava

+0

Merci pour l'explication. Lire SO et apprendre est une joie! – lexu