web-dev-qa-db-fra.com

Comment fonctionnent les index composites?

J'ai déjà créé des index composites ( indices pour vous mathématiciens) sur des tables avec une hypothèse sur leur fonctionnement. J'étais juste curieux de savoir si mon hypothèse est correcte ou non.

Je suppose que lorsque vous répertoriez l'ordre des colonnes pour l'index, vous spécifiez également le mode de regroupement des index. Par exemple, si vous avez les colonnes a, b et c et que vous spécifiez l'index dans le même ordre a ASC, b ASC et c ASC, alors l'index résultant sera essentiellement constitué d'indices pour chaque "groupe" dans a.

Est-ce correct? Sinon, à quoi ressemblera l'indice résultant?

55
Joe Phillips

Les index composites fonctionnent comme les index normaux, à la différence qu’ils ont des clés à valeurs multiples.

Si vous définissez un index sur les champs (a, b, c), les enregistrements sont d'abord triés sur a, puis b, puis c. 

Exemple:

| A | B | C |
-------------
| 1 | 2 | 3 |
| 1 | 4 | 2 |
| 1 | 4 | 4 |
| 2 | 3 | 5 |
| 2 | 4 | 4 |
| 2 | 4 | 5 |
64
Rik

L'index composite ressemble à un index alphabétique simple dans un dictionnaire, mais couvre au moins deux lettres, comme ceci:

AA - page 1
AB - page 12

etc.

Les rangées de table sont classées en premier par la première colonne de l'index, puis par la seconde, etc.

Il est utilisable lorsque vous recherchez par les deux colonnes OR par la première colonne. Si votre index est comme ça:

AA - page 1
AB - page 12
…
AZ - page 245
BA - page 246
…

vous pouvez l'utiliser pour effectuer une recherche sur 2 lettres (= 2 colonnes d'un tableau) ou comme un index simple sur une lettre:

A - page 1
B - page 246
…

Notez que dans le cas d'un dictionnaire, les pages elles-mêmes sont classées par ordre alphabétique. C'est un exemple d'index CLUSTERED.

Dans un index simple, non -CLUSTERED, les références aux pages sont ordonnées, comme dans un livre d'histoire:

Gaul, Alesia: pages 12, 56, 78
Gaul, Augustodonum Aeduorum: page 145
…
Gaul, Vellaunodunum: page 24
Egypt, Alexandria: pages 56, 194, 213, 234, 267

Les index composites peuvent également être utilisés lorsque vous ORDER BY deux colonnes ou plus. Dans ce cas, une clause DESC peut s'avérer utile.

Voir cet article de mon blog sur l'utilisation de la clause DESC dans un index composite:

29
Quassnoi

La mise en œuvre la plus courante des indices utilise des arbres B pour permettre des recherches assez rapides, ainsi que des balayages de distance raisonnablement rapides. C'est trop d'expliquer ici, mais voici l'article de Wikipedia sur B-trees . Et vous avez raison, la première colonne que vous déclarez dans l'index de création sera la colonne de poids fort dans l'arbre B résultant.

Une recherche dans la colonne d'ordre élevé équivaut à un balayage d'intervalle et un index B-tree peut être très utile pour une telle recherche. La meilleure façon de voir cela est par analogie avec les anciens catalogues de cartes que vous avez dans des bibliothèques qui n'ont pas encore été converties en catalogues en ligne. 

Si vous recherchez toutes les cartes des auteurs dont le nom de famille est "Clemens", il vous suffit de consulter le catalogue des auteurs et de trouver très rapidement un tiroir portant l'inscription "CLE-CLI" au recto. C'est le bon tiroir. Maintenant, vous effectuez une sorte de recherche binaire informelle dans ce tiroir pour trouver rapidement toutes les cartes portant l'inscription "Clemens, Roger" ou "Clemens, Samuel".

Mais supposons que vous vouliez trouver toutes les cartes pour les auteurs dont le prénom est "Samuel". Maintenant, vous êtes dans le ruisseau, car ces cartes ne sont pas rassemblées au même endroit dans le catalogue Author. Un phénomène similaire se produit avec des indices composites dans une base de données.

Les SGBD diffèrent par le degré d'ingéniosité de leur optimiseur pour la détection des balayages de plages d'index et l'estimation exacte de leur coût. Et tous les indices ne sont pas des arbres B. Vous devrez lire la documentation de votre SGBD spécifique pour obtenir les informations réelles. 

17
Walter Mitty

Non. L'index résultant sera un index unique mais avec une clé composée.

KeyX = A, B, C, D; KeyY = 1,2,3,4;

Index KeyX, KeyY sera en réalité: A1, A2, A3, B1, B3, C3, C4, D2

Donc au cas où vous auriez besoin de trouver quelque chose par KeyX et KeyY - ce sera rapide et utilisera un seul index. Quelque chose comme SELECT ... WHERE KeyX = "B" AND KeyY = 3.

Mais il est important de comprendre: WHERE KeyX =? request will utilisera cet index, tandis que WHERE KeyY =?PASutilisera cet index du tout.

4
Mash

D'après ce que je comprends, les index composites fonctionnent comme les index normaux, à la différence qu'ils ont des clés à valeurs multiples. Si vous définissez un index sur les champs (a, b, c), l’index composite étant stocké dans un arbre BinaryTree, votre index ne fonctionnera donc qu’à la suite de combinaisons de recherches.

ABC
AB
A

Par exemple, créer un index composite pour les champs a, b et c revient à créer des index séparés pour a, ab et abc.

0
tk_