Aikido

Pourquoi éviter les index de base de données redondants : optimisation du stockage et des performances d'écriture

Performance

Règle

Éviter redondante base de données redondants.
Le chevauchement des index de base de données de base de données gaspille
stockage et ralentir ralentissent écrit.

Langages pris en charge : SQL

Introduction

Les index redondants se produisent lorsque plusieurs index couvrent les mêmes colonnes ou lorsqu'un index est un préfixe d'un autre. Chaque index consomme de l'espace disque et doit être mis à jour lors des opérations INSERT, UPDATE et DELETE. Une table avec cinq index superposés sur des colonnes similaires subit cinq fois la pénalité de performance en écriture alors qu'un seul index suffirait pour l'optimisation de la lecture.

Pourquoi c'est important

Impact sur la performance : Chaque index ralentit les opérations d'écriture car la base de données doit mettre à jour tous les index lorsque les données changent. Les index redondants multiplient ce coût sans apporter d'avantages en termes de requêtes. Une table avec trois index redondants sur user_id triple la surcharge d'écriture alors qu'un seul index est utilisé.

Coûts de stockage : Les index consomment de l'espace disque proportionnellement à la taille des colonnes indexées et au nombre de lignes. Les index redondants gaspillent de l'espace de stockage qui pourrait être utilisé pour des données réelles ou des index utiles. Les grandes tables avec des index inutiles peuvent gaspiller des gigaoctets de stockage.

Complexité de la maintenance : Plus d'index signifient plus d'objets à surveiller, analyser et maintenir. Les administrateurs de bases de données passent du temps à optimiser des index qui n'apportent aucune valeur. Les planificateurs de requêtes ont plus d'options à évaluer, ce qui peut potentiellement conduire à des plans d'exécution sous-optimaux.

Exemples de code

❌ Non conforme :

-- Index redondants sur la table users
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_email_status ON users(email, status);
CREATE INDEX idx_users_created ON users(created_at);
CREATE INDEX idx_users_created_status ON users(created_at, status);

-- Les index à colonne unique sont redondants car
-- les index composites peuvent servir les mêmes requêtes

Pourquoi c'est incorrect : L'index sur l'email est redondant car idx_users_email_status commence par e-mail et peut gérer des requêtes filtrant uniquement par e-mail. De même, idx_users_created est redondant avec idx_users_created_status. Chaque insertion ou mise à jour de cette table met à jour quatre index alors que deux suffiraient.

✅ Conforme :

-- Index optimisés sur la table users
CREATE INDEX idx_users_email_status ON users(email, status);
CREATE INDEX idx_users_created_status ON users(created_at, status);

-- Les index composites peuvent servir des requêtes sur leurs colonnes de préfixe
-- Les requêtes sur l'email seul utilisent idx_users_email_status
-- Les requêtes sur created_at seul utilisent idx_users_created_status

Pourquoi c'est important : Deux index composites servent tous les modèles de requête tout en éliminant la redondance. Les requêtes filtrant par e-mail utilisent uniquement le premier index, et les requêtes filtrant par créé_le utilisent uniquement le second. Les performances d'écriture s'améliorent car seuls deux index nécessitent des mises à jour au lieu de quatre.

Conclusion

Auditez régulièrement les index de votre base de données pour identifier les redondances. Supprimez les index qui sont des préfixes d'autres index ou qui dupliquent la couverture. Les index composites peuvent servir les requêtes sur leurs colonnes principales, éliminant ainsi le besoin d'index séparés à colonne unique dans la plupart des cas.

FAQ

Des questions ?

Comment identifier les index redondants dans ma base de données ?

Interrogez les tables système de votre base de données pour lister tous les index. Pour PostgreSQL, utilisez la vue pg_indexes. Pour MySQL, utilisez SHOW INDEX FROM table_name. Recherchez les index où l'un est un préfixe de l'autre (email vs email+status) ou où plusieurs index couvrent les mêmes colonnes dans des ordres différents.

Quand un index à colonne unique n'est-il pas redondant avec un index composite ?

Quand la sélectivité des requêtes est importante. Si vous interrogez fréquemment uniquement la deuxième colonne d'un index composite, cette requête ne peut pas utiliser l'index efficacement. Un index sur (status, email) n'aidera pas les requêtes filtrant uniquement par email. Cependant, un index sur (email, status) peut servir les requêtes portant uniquement sur l'email.

Comment les index redondants affectent-ils les performances des requêtes ?

Minimale pour les lectures, significative pour les écritures. L'optimiseur de requêtes pourrait choisir entre des index redondants, mais le temps d'exécution est similaire. Cependant, chaque écriture (INSERT, UPDATE, DELETE) doit mettre à jour tous les index, multipliant les opérations d'E/S. Pour les tables à forte charge d'écriture, la suppression des index redondants peut améliorer le débit de 20 à 50%.

Dois-je supprimer tous les index à colonne unique si j'ai des index composites ?

Pas toujours. Si l'index à colonne unique est très sélectif et fréquemment interrogé seul, conservez-le. Utilisez les statistiques de requêtes de la base de données pour voir quels index sont réellement utilisés. Supprimez les index avec une utilisation nulle ou très faible. Les bases de données modernes suivent l'utilisation des index dans les vues système.

Sécurisez-vous maintenant.

Sécuriser votre code, votre cloud et votre runtime dans un système centralisé unique.
Détectez et corrigez les vulnérabilités rapidement et automatiquement.

Pas de carte de crédit requise | Résultats du scan en 32 secondes.