Aller au contenu Aller au menu
Vous êtes ici : Développement > MySQL > 2) Indexer les données > a) L'index : un marque-page dans la base de données
Langue : fr

a) L'index : un marque-page dans la base de données

L'indexation est un processus qui permet de fortement optimiser le fonctionnement de MySQL lors du requêtage sur une table (et a fortiori sur plusieurs d'entre elles). Son principe est très exactement celui de l'index d'un livre : l'accès aux données est réorganisé sous forme d'une série de mots (ou valeurs), avec un renvoi vers les pages du livre contenant ce mot (ou les enregistrements contenant cette valeur).

Sans index, MySQL doit parcourir ligne par ligne l'ensemble de la table de données pour trouver les enregistrements correspondant à une requête, ce qui est particulièrement lent.

Techniquement, l'index duplique les valeurs du champ indexé, puis les réorganise sous la forme d'un arbre binaire structurant les données stockées dans un champ (ou plusieurs), afin d'accéder rapidement aux enregistrements recherchés. Cet arbre est optimisé de plusieurs façons :

  • en structurant verticalement les enregistrements, ce qui permet d'écarter rapidement une branche entière sans la parcourir entièrement
  • en triant les enregistrements par ordre d'index, ce qui permet de trouver plus rapidement le premier enregistrement correspondant à une valeur, et de parcourir les enregistrements suivants séquentiellement jusqu'au dernier correspondant, sans parcourir aucun des enregistrements ne correspondant pas à l'item recherché.

Ce fonctionnement montre de façon flagrante pourquoi les données doivent être normalisées pour qu'une indexation puisse être efficace. Un des cauchemars d'un bon index est une donnée dont les valeurs sont stockées sous la forme d'une chaîne de caractères unique dans un champ d'une table, là où une table d'association aurait été nécessaire (ex. les numéros identifiant les différents interlocuteurs auxquels a déjà eu affaire un client).

Un champ non normalisé :

  • désactive les recherches (un index permet la recherche caractère après caractère, en partant de la gauche : comment faire pour des valeurs concaténées ?) et oblige à lire l'ensemble de la table pour toute recherche sur ce champ
  • rend toute recherche sur ce champ complexe (utilisation de requêtes en LIKE '%...%')

Les index sont de quatre types :

  • PRIMARY KEY : la clé primaire est un champ identifiant chaque enregistrement de façon unique. A leur insertion, les enregistrements sont triés (ordonnés) par rapport à ce champ, ce qui explique qu'il ne peut y en avoir qu'une (à titre de comparaison : dans une bibliothèque, on ne peut pas trier des livres à la fois par nom d'auteur et par couleur). Il s'agit bel et bien d'un index, il est donc inutile de poser un deuxième index sur la clé primaire (c'est même contre-productif).
  • UNIQUE : le champ doit être différent pour chaque enregistrement, mais peut être de valeur NULL, à la différence de la clé primaire.
  • INDEX : le champ est indexé sans contrainte.
  • FULLTEXT : le champ est indexé pour la recherche sur du texte. Une opération de recherche de texte est naturellement lourde, mais si vous devez impérativement en faire, autant bien vous y prendre et indexer le champ comme il se doit.
  1. MySQL
    1. 1) Bien concevoir la base de données
      1. a) Choix des tables – Normalisation des données
      2. b) Choix et typage des champs
    2. 2) Indexer les données
      1. a) L'index : un marque-page dans la base de données
      2. b) Une forte cardinalité pour un bon index
      3. c) Une utilisation récurrente pour un bon index
      4. d) Gare aux contre-optimisations
    3. 3) Optimiser les requêtes SQL
      1. a) Utiliser la richesse du langage SQL
      2. b) Optimiser les jointures
      3. c) Mettre à profit une bonne indexation
    4. 4) Corriger les requêtes lentes
      1. a) L'optimisation de requête par EXPLAIN
      2. b) L'analyse post-mortem
    5. 5) Le serveur MySQL – maintenance et backup
      1. a) Minimiser l'impact des opérations de maintenance
      2. b) Sauvegarde et restauration des bases de données
      3. c) Maintenance des tables