Question

Disons que vous avez une table MyISAM MySQL 5.0 avec 100 millions de lignes, avec un index (autre que clé primaire) sur deux colonnes entières.

De mon certes une mauvaise compréhension de la structure B-tree, je crois que bas cardinalité signifie l'efficacité de stockage de l'indice est préférable, car il y a moins de nœuds parents. Alors qu'un supérieur cardinalité moyens de stockage moins efficace, mais plus rapide lire performances, car il doit naviguer dans moins de branches pour se rendre à toutes les données qu'il cherche à limiter les lignes pour la requête.

(Note - par "faible" vs "haut", je ne pour une table de 100 millions de rangée signifie pas, par exemple de 1 million à 99 millions vs je veux dire plus à 90 millions vs 95 millions).

Est-ce que je comprends bien?

question connexe - Comment cardinalité affecte write performances

Était-ce utile?

La solution

  

Alors un moyen de stockage moins efficace cardinalité plus, mais plus rapide des performances de lecture, car il doit naviguer dans moins de branches pour se rendre à toutes les données qu'il cherche à limiter les lignes de la requête.

supérieur cardinalité signifie de meilleures performances de lecture parce que, par définition, il y a moins d'enregistrements à lire.

Pour traiter une requête comme ceci:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue

, le moteur devrait faire les étapes suivantes:

  1. Trouvez la première entrée répondant à la condition.

    Ceci est fait traverser la B-Tree, à partir de l'entrée racine.

    A travers les pages, la recherche est effectuée en suivant les liens de B-Tree; dans une page, la recherche est effectuée en utilisant la recherche binaire (à moins que vos clés sont compressés, dans ce cas, il est une recherche linéaire).

    Cet algorithme même efficacité pour les deux haut et bas cardinalité colonnes de cardinalité. Trouver la première 3 (par opposition à tout 3) dans ces listes:

    1  2  3  4  5  6  7  8  9  10
    
    3  3  3  3  3  3  3  3  4  4
    

    nécessite même pas de O(log(n)).

  2. Traversant l'indice jusqu'à ce que les changements de valeur clés. Ceci, bien sûr, nécessite un temps linéaire:. Plus les dossiers que vous avez, plus vous devez traverser

Si vous avez seulement besoin du premier enregistrement:

SELECT  *
FROM    mytable
WHERE   indexed_col = @myvalue
LIMIT 1

, la cardinalité de la colonne ne modifie pas les performances de lecture.

  

Comment cardinalité affecte les performances d'écriture?

Chaque clé d'index a une valeur supplémentaire cachée: un pointeur d'enregistrement. Ceci est le point entier d'avoir un indice:. Vous devez savoir quel enregistrement ne pointer vers

Depuis un pointeur d'enregistrement, par définition, est unique, chaque clé d'index est trop unique. Les entrées d'index partageant la même valeur de clé sont triées par le pointeur d'enregistrement.

est de rendre l'index maintenable: si vous supprimez un enregistrement avec une valeur d'une colonne indexée partagée par un million d'autres dossiers, le dossier d'index correspondant devrait être supprimé aussi. Mais l'ensemble des millions les lignes d'index n'est pas regardé à travers:. A la place, le pointeur d'enregistrement est utilisé comme condition de recherche supplémentaire

Chaque clé d'index est en fait unique, (même si vous ne définissez pas l'index comme pièce unique), et, par conséquent, a cardinalité maximum.

Donc, la réponse à vos questions est:. Non, la cardinalité de la colonne n'affecte pas les performances d'écriture d'index

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top