Accueil Recherche | Plan Technique | Liens | Actualités | Formation | Emploi | Forums | Base
TUTORIEL cerig.efpg.inpg.fr 
Vous êtes ici : Accueil > Formation > Tutoriels > Bases de données relationnelles > Les index
        Révision : 08 juin 2011
 
                  Les bases de données
relationnelles
                 
Chap.
précéd.
Plan du
tutoriel
Liste des
tutoriels
Chap.
suivant
Chapitre 3 : Les index
1 - Introduction
                  Les bases de données prennent souvent des proportions importantes, voire considérables. Si une recherche d'information dans une table s'effectue de manière simplement séquentielle (c'est à dire en examinant toute la table, ou du moins tous les champs concernés, du début jusqu'à la fin), le temps d'attente peut devenir prohibitif pour l'opérateur. L'index est l'outil qui permet de résoudre ce problème.          
La notion d'index est très ancienne. Elle semble remonter à la grande bibliothèque d'Alexandrie, célèbre dans l'Antiquité, mais malheureusement détruite par un incendie. Cette bibliothèque s'était dotée d'un index par auteurs et d'un index par matières pour faciliter les recherches de ses lecteurs parmi les nombreux ouvrages (en papyrus) qu'elle possédait.
Imaginons une bibliothèque dans laquelle les livres sont rangés n'importe comment -- au fur et à mesure de leur acquisition, par exemple. Pour rechercher un livre dont on connaît le titre, il faut parcourir rayons dans l'ordre (recherche séquentielle). Ou l'on finit par trouver (ouf !), ou l'on arrive bredouille au dernier rayonnage et on en conclut que la bibliothèque ne possède pas l'ouvrage.
Bien entendu, personne ne sera jamais assez sot pour organiser une bibliothèque de pareille façon. Les livres seront rangés par ordre alphabétique du titre, par exemple. Si le titre que nous recherchons commence par un L, nous irons vers le rayon du milieu et nous examinerons un ouvrage. Si son titre commence par un P, nous conclurons que nous sommes allés trop loin. Nous reculerons quelque peu, et nous réitérerons notre démarche . Nous arriverons beaucoup plus vite que précédemment à trouver le livre que nous recherchons, ou à conclure qu'il n'est pas dans la bibliothèque, parce que nous pratiquons une méthode dichotomique (quelque peu optimisée), qui nous permet d'arriver au résultat en n'examinant qu'une petite fraction des livres contenus dans la bibliothèque. Nous pouvons pratiquer une technique efficace de recherche parce que les livres constituent un ensemble ordonné. Dans un ensemble désordonné, on ne peut pratiquer qu'une recherche séquentielle, beaucoup plus lente.
Mais... comment ferons-nous si nous recherchons un livre dont nous connaissons l'auteur, mais pas le titre ? Les livres de la bibliothèque ne peuvent pas être triés à la fois par ordre alphabétique de leur titre, et celui de leur auteur. C'est ici qu'intervient la notion d'index. Pour chaque livre, nous créons une fiche sur laquelle nous inscrivons le nom de l'auteur et le titre du livre. Puis nous rangeons ces fiches par ordre alphabétique des noms d'auteur. Pour rechercher le livre d'un auteur donné, nous compulsons les fiches. Comme elles constituent un ensemble ordonné, l'opération est rapide ; ou nous obtenons le titre du livre, ou nous concluons que le livre ne se trouve pas dans la bibliothèque. Dans le premier cas, nous nous rendons dans les rayons munis du titre, et comme les livres sont classés par ordre alphabétique de leur titre, notre trouvons rapidement l'ouvrage en question.
Imaginons maintenant que la bibliothèque soit gérée par ordinateur. Si la table qui contient les livres est triée par ordre alphabétique des titres, il faut que nous construisions un index informatique sur le champ auteur pour que la recherche d'un livre dont on connaît l'auteur s'effectue rapidement. Car l'ordinateur est programmé à l'image de ce que font les humains : dans un ensemble non trié il recherche séquentiellement, alors que dans un ensemble trié il recherche par dichotomie. Dans le second cas, il va beaucoup plus vite.
Comme pour l'ensemble de ce tutoriel (cours en ligne, ou tutorial), nous utilisons le SGBD Access comme support pratique.
2 - Le fonctionnement de l'index
                  Nous disposons maintenant d'un ordinateur pour gérer la bibliothèque. Au fur et à mesure que nous achetons des livres, nous les numérotons dans l'ordre. Puis nous saisissons dans la table d'une BDD les données qui les caractérisent (numéro, titre, auteur, éditeur, année d'édition, ISBN, etc.), et nous les rangeons sur les rayons dans l'ordre de leur numéro. La table se présente ainsi :          
Titre Auteur Éditeur Année ISBN etc.
1 Mon jardin J. Machin Eyrolles 1998 5-1234-4321-8 ...
2 Access A. Chose Dunod 2002 3-6789-9876-2 ...
3 Les écoles S. Truc Lattès 2001 4-1985-5891-3 ...
4 etc.
En informatique, un index est représenté par une table à une seule colonne, comme on le voit sur la figure ci-dessous. Dans le premier index (index sur le titre), le premier titre par ordre alphabétique correspond au livre n° 2 (Access), suivi du livre n° 3 (Les écoles) et du livre n° 1 (Mon jardin). Les autres index s'interprètent de la même façon.
2
3
1
..
     
2
1
3
..
     
2
1
3
..
     
1
3
2
..
     
2
3
1
..
Index titre Index auteur Index éditeur Index année Index ISBN
L'index présente des avantages :
            il accélère les recherches d'information. En effet, l'index est une représentation de la table, triée sur un champ donné. On peut donc lui appliquer les méthodes connues de recherche rapide sur un ensemble ordonné (c'est le SGBD qui se charge de l'opération, laquelle est transparente pour l'opérateur) ;
  il est de taille très inférieure à celle de la table : on peut le remettre à jour en temps réel à chaque modification de cette dernière ;
  il peut servir à empêcher l'opérateur de créer des enregistrements dupliquées en saisissant deux fois, par erreur, les mêmes données. Nous reviendrons sur ce point au paragraphe suivant.
L'index ne possède pas que des avantages. Voici pour ses inconvénients :
            chaque fois que nous demandons au système de créer (et de maintenir) un index, nous augmentons sa charge de travail, et par conséquent nous le freinons. Ainsi, les opérations de saisie et de maintenance sont ralenties par la présence d'index, car ces derniers doivent être mis à jour immédiatement ;
  un index occupe de la place en mémoire sur le disque. En fait, ce dernier argument a beaucoup perdu de sa valeur avec le temps, parce que la mémoire de masse des ordinateurs ne cesse de croître rapidement, et qu'elle est devenue si bon marché (son coût à l'octet est divisé par deux tous les deux ans environ) qu'on la gaspille allégrement.
L'informatique permet de créer des index sur plusieurs champs. Imaginons que nous ayons séparé le nom et le prénom de l'auteur, par exemple. Un index sur les deux champs nom et prénom correspond en fait à l'index créé sur un champ unique dans lequel nous aurions concaténé le nom et le prénom.
3 - Les doublons
                  On appelle "doublon" une information qui apparaît au moins deux fois dans une table. La notion de doublons s'applique à une colonne donnée, ou à plusieurs colonnes, ou à la totalité des colonnes d'une même table (figure ci-dessous). Dans cedernier cas, nous avons affaire à deux enregistrements (ou plus) identiques, une situation qu'il faut toujours considérer comme anormale.          
A B C
 1   aa   $ 
 2  bb  %
 3  cc  +
 1  dd   -
A B C
 1   aa   $ 
 2  bb  %
 3  cc  +
 1  aa   -
A B C
 1   aa   $ 
 2  bb  %
 3  cc  +
 1  aa  $
Doublon sur
une colonne
Doublon sur
deux colonnes
Enregistrement
dupliqué
Dans une BDD, les enregistrements dupliqués peuvent provenir de deux sources :
            les erreurs de saisie. Le taux des erreurs humaines est de l'ordre de un à quelques pourcents. Il est inévitable que, de temps en temps, un opérateur tente d'introduire dans une BDD des informations qui s'y trouvent déjà. Il est normal de confier au SGBD le soin de l'en empêcher ;
  la manipulation des informations contenues dans la base. Considérons par exemple la table qui illustre ci-dessus le cas du doublon sur deux colonnes. Si, pour une raison quelconque, nous supprimons la troisième colonne, nous transformons ce doublon sur deux colonnes en un enregistrement dupliqué, dont la présence peut être souhaitée (comptage), inutile ou nuisible suivant les cas.
Lorsque nous introduisons de l'information dans une table pourvue d'un index, le SGBD met ce dernier à jour en temps réel. Au cours de cette opération, il peut détecter facilement si cette nouvelle information constitue un doublon sur les champs concernés. Il est donc aisé de doter le SGBD d'une fonction permettant, si on le désire, d'empêcher la validation de la saisie d'un enregistrement constituant un doublon.
Nous reviendrons, dans les chapitres relatifs aux requêtes, sur le problème de la création de doublons indésirables lors de la manipulation des informations d'une BDD.
4 - L'indexation d'un champ
                  Dans le chapitre consacré aux tables, nous avons rencontré la "Propriété du champ" intitulée "Indexé", pour tous les types de données sauf "Objet OLE". Quand nous cliquons dans la zone de texte correspondante, une liste déroulante nous est proposée, qui contient les trois choix suivants :          
            Non
  Oui - Avec doublons
  Oui - Sans doublons
Pour créer un index sur le champ correspondant, il suffit de répondre "Oui", avec ou sans doublon selon le cas. Si nous conservons la valeur "Non" par défaut, aucun index ne sera créé.
Il est inutile de ralentir le fonctionnement du système lors de la saisie des données, si cela ne nous fait pas gagner du temps ultérieurement. Il est donc préférable de répondre "Non" dans les cas suivants :
            la table considérée contient peu d'enregistrements ;
  nous effectuons rarement (voire jamais) de recherche dans ce champ ;
  nous ne trions jamais la table sur ce champ ;
  il est normal que le champ contienne des doublons. Ainsi, il est totalement inutile d'indexer un champ booléen, bien que ce soit techniquement possible.
Dans les cas contraires, la création d'un index présente de l'intérêt. Se pose alors le problème de savoir si nous admettons ou non les doublons :
            si les doublons ne posent pas de problème (ex : homonymie), nous choisirons l'option "Avec doublons". Ceci dit, indexer dans le seul but de rendre les recherches plus rapides, sans chercher à empêcher les fautes de saisie, peut constituer dans certains cas une erreur ;
  dans le cas général, nous choisirons l'option "Sans doublons", ce qui aura pour effet de nous empêcher de créer des doublons par mégarde. Le système refusera de valider l'enregistrement fautif (lors du passage à la ligne suivante, ou lors de la fermeture de la table).
Rappelons pour mémoire qu'un champ doté d'une clé est toujours indexé sans doublons. Or une table ne peut contenir qu'une seule clé, alors qu'elle peut être dotée de plusieurs index. Il faut donc réserver la clé pour la réalisation des relations, et ne pas l'utiliser comme index.
5 - La création d'un index multi-champ
                  Dans une table contenant des données relatives à plusieurs milliers de personnes, le risque d'homonymie devient important. A fortiori dans une plus grande table, celle représentant l'annuaire téléphonique d'une grande ville par exemple. Pour accepter l'homonymie tout en rejetant les doublons dus à des erreurs de saisie, on utilise un index basé sur plusieurs champs. Si la probabilité de trouver deux fois "Dupont" est importante, celle de trouver deux fois "Dupont Jean" est déjà nettement plus faible, et celle de trouver deux fois "Dupont Jean né le 12/06/1978" est pratiquement nulle. En créant un index sur deux champs (Nom + Prénom) ou sur trois champs (Nom + Prénom + Date de naissance), on peut rejeter les doublons dus à des erreurs de saisie tout en tolérant parfaitement l'homonymie. On notera que le SGBD Access permet de grouper dix champs au maximum dans un index multi-champ, mais qu'on ne dépasse pratiquement jamais la valeur trois.          
Pour créer un index multi champ, il faut se trouver en mode création de la table, et cliquer sur l'icône  "Index". Une fenêtre s'ouvre, et l'on procède aux opérations suivantes :
            dans la colonne de gauche, on donne un nom à l'index multi-champ ;
  dans la colonne médiane, on écrit les uns sous les autres les noms des champs constitutifs de l'index ;
  dans la colonne de droite, on précise l'ordre de tri. Par défaut, on conserve "Croissant" ;
  on clique sur le nom de l'index puis, dans la moitié inférieure de la boite, intitulée "Propriétés de l'index", on fixe à "Oui" la propriété "Unique" si l'on désire interdire les doublons.
La figure ci-dessous représente l'état de la boite de dialogue en fin de saisie, dans le cas simple où seulement deux champs ("Nom" et "Prénom") sont concernés.
Définition d'un index multi-champ
Plusieurs index multi-champ peuvent coexister dans une même table. Ils peuvent également cohabiter avec une clé. Tout ce petit monde se retrouve listé dans la fenêtre de définition des index. L'index relatif à une clé se repère à l'icône correspondante dans la colonne (grisée) la plus à gauche, à son nom "PrimaryKey", et par le fait que la propriété "Primaire" affiche "Oui", comme le montre la figure ci-dessous.
La clé primaire dans la fenêtre Index
On notera pour terminer que, si un champ fait partie d'un index multi-champ, sa propriété "Indexé" vaut "Non". C'est normal, il ne faut rien y changer.
6 - Conclusion
                  Les index jouent un rôle discret mais important dans la gestion des BDD.          
La décision de créer un index résulte de l'examen des avantages et inconvénients de cette opération. L'index ralentit les saisies et consomme un peu de place, mais il rend les tris et les recherches d'information plus rapides. Bien entendu, il est inutile de créer un index sur quelque champ que ce soit dans une table qui renferme très peu d'enregistrements.
L'index joue un rôle important dans l'élimination des doublons résultant d'erreurs de saisie.
Chapitre précédent Plan du tutoriel Liste des tutoriels Chapitre suivant
Accueil | Technique | Liens | Actualités | Formation | Emploi | Forums | Base
Copyright © CERIG/EFPG 1996-2003
Réalisation et mise en page : J.C. Sohm