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 :
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é :
Les index sont de quatre types :