Demandez à n'importe quel administrateur de base de données expérimenté quelle modification permet d'améliorer le plus efficacement les performances des requêtes, et la réponse sera presque toujours la même : une meilleure indexation. Pourtant, les index comptent parmi les outils les plus mal compris de l'arsenal du développeur de bases de données. De nombreux développeurs les ajoutent de manière réactive, les suppriment avec hésitation et choisissent le mauvais type simplement parce qu'ils ne savent pas quelles sont les alternatives. Ce guide présente les principaux types d'index (arbre B, hachage, partiel et composite), explique leurs cas d'utilisation et montre comment le concepteur de tables de Navicat simplifie la création et la gestion des index.
Pourquoi les index sont importants
Un index est une structure de données distincte que la base de données gère parallèlement à votre table. Il est conçu pour permettre des recherches spécifiques sans avoir à analyser chaque ligne. Sans index sur une colonne fréquemment interrogée, la base de données effectue une analyse complète de la table à chaque requête. Si ce processus reste tout à fait acceptable pour quelques milliers de lignes, il devient extrêmement lent lorsqu’il s’agit de millions de lignes. En contrepartie, chaque index engendre une surcharge sur les opérations d'écriture, car les insertions, les mises à jour et les suppressions doivent mettre à jour l'index autant que la table. Choisir ses index de manière réfléchie, plutôt que de manière inconsidérée, est ce qui distingue un schéma bien optimisé d'un schéma rapide en lecture mais lent en écriture.
Index B-tree : Le choix par défaut judicieux
L’index B-tree (arbre équilibré) est celui créé par la plupart des bases de données lorsqu’aucune autre spécification n’est fournie, et ce à juste titre. Il stocke les valeurs dans une structure hiérarchique et triée, ce qui le rend efficace pour les correspondances exactes, les requêtes par plage et les opérations de tri. Si votre requête inclut une clause WHERE comparant une colonne avec =, <, >, BETWEEN, or LIKE ‘prefix%’, un index B-tree sur cette colonne est presque certainement le choix idéal.
Une chose que les débutants oublient souvent, c’est que les index B-tree prennent également en charge le tri. Si votre requête trie les résultats selon une colonne indexée, la base de données peut lire l’index dans l’ordre plutôt que de trier l’ensemble des résultats, ce qui permet un gain de performance significatif sur les grandes tables.
Index de hachage : rapides mais limités
Les index de hachage stockent un hachage calculé de chaque valeur de colonne plutôt que la valeur elle-même. Cela les rend extrêmement rapides pour les recherches par correspondance exacte : la base de données calcule le hachage de votre terme de recherche et accède directement à l’entrée correspondante. Leur limite réside dans le fait que les index de hachage sont inutiles pour les requêtes par plage ou le tri, car les valeurs hachées n'ont pas d'ordre significatif. Ils ne prennent pas non plus en charge les recherches sur plusieurs colonnes.
Les index de hachage sont particulièrement adaptés aux colonnes pour lesquelles vous n’utiliserez que l’opérateur « = » et dont les valeurs sont très distinctes, comme les UUID ou les jetons de session. Sous MySQL, les index de hachage sont uniquement disponibles sur les tables en mémoire ; sous PostgreSQL, ils constituent une option pleinement prise en charge sur les tables classiques et sont devenus de plus en plus performants dans les versions récentes.
Index partiels : indexer uniquement les lignes interrogées
Un index partiel (également appelé « index filtré » dans SQL Server) est créé sur un sous-ensemble de lignes défini par une condition. Par exemple, si votre table « commandes » contient des millions de lignes, mais que votre application interroge presque exclusivement les commandes dont le statut est « en attente », un index partiel sur le statut (« statut = 'en attente' ») sera beaucoup plus petit et plus rapide qu'un index complet sur la colonne.
Les index partiels sont particulièrement utiles pour les modèles de suppression logique, où une grande proportion de lignes sont marquées comme supprimées et rarement interrogées. Exclure ces lignes de l'index permet de le garder léger et de faciliter le travail de votre planificateur de requêtes. PostgreSQL offre une prise en charge native des index partiels ; SQL Server obtient le même résultat grâce à des index filtrés dont la sémantique est presque identique.
Index composites : l'ordre des colonnes est primordial
Un index composite s’étend sur plusieurs colonnes et, bien conçu, il peut répondre à des requêtes complexes à plusieurs colonnes sans que la base de données n’accède à la table sous-jacente. Le principe fondamental à retenir est qu’un index composite ne s’utilise que de gauche à droite. Un index sur (nom, prénom) facilitera le filtrage d’une requête sur le nom, ou sur le nom et le prénom, mais sera inefficace pour une requête filtrant uniquement sur le prénom.
La règle générale pour l’ordre des colonnes dans un index composite est de placer la colonne la plus sélective en premier, c’est-à-dire celle qui élimine le plus de lignes. Les colonnes utilisées dans les conditions d’égalité (=) doivent précéder celles utilisées dans les conditions d’intervalle (>, <, BETWEEN), car une condition d’intervalle à une position donnée dans l’index empêche l’optimiseur d’utiliser efficacement les colonnes suivantes.
Gestion des index avec le concepteur de tables de Navicat
Le concepteur de tables de Navicat offre un environnement visuel et pratique pour créer et gérer tous les types d'index décrits ci-dessus, sans avoir à écrire de code DDL manuellement. Les index sont gérés dans un onglet dédié, distinct de l'onglet Champs où sont définies les colonnes. Cette séparation permet de visualiser d'un seul coup d'œil la stratégie d'indexation d'une table.
Pour ajouter un index, il suffit de lui donner un nom, de sélectionner la ou les colonnes concernées, puis de choisir le type et la méthode d'indexation dans les menus déroulants. Il est essentiel de noter que les options disponibles dans ces menus déroulants sont adaptées à la base de données spécifique à laquelle vous êtes connecté. Si vous travaillez sous MySQL, vous verrez les types d'index pris en charge par MySQL ; passez à une connexion PostgreSQL et les options refléteront les capacités de PostgreSQL, notamment B-tree, hash, GIN, GiST et autres. Ce comportement contextuel vous évite d'avoir à deviner quelles options sont valides pour votre base de données cible.
Pour les index composites, vous pouvez ajouter plusieurs champs à une seule entrée d'index et les réorganiser selon la priorité de colonnes souhaitée. Comme indiqué précédemment, cela influe directement sur l'utilisation de l'index. Les colonnes de clé primaire sont visibles dans l'onglet Champs, où elles sont clairement identifiées, tandis que tous les index secondaires se trouvent dans l'onglet Index.
Conclusion
Une bonne indexation ne consiste pas tant à multiplier les index qu'à choisir les bons. Les index B-tree couvrent la grande majorité des requêtes courantes ; les index de hachage sont particulièrement adaptés aux cas de correspondance exacte ; les index partiels optimisent le système lorsqu'on interroge uniquement un sous-ensemble des données ; et les index composites, lorsqu’ils sont définis dans le bon ordre, peuvent remplacer avantageusement plusieurs index à colonne unique. Comprendre ces distinctions et utiliser un outil comme le Concepteur de tables de Navicat pour les implémenter et les valider efficacement vous permettra de maintenir des requêtes rapides malgré la croissance de vos données.

