Un index oublié fait passer une requête de 5 ms à 5 s. Un index inutile ralentit chaque insert. Voici les 6 règles à appliquer.
Règle d'or : indexez chaque colonne utilisée dans unWHERE, JOIN ou ORDER BY critique. Rien d'autre.
1. B-tree par défaut
Chaque foreign key doit avoir son index B-tree. Postgres ne le fait pas automatiquement.
2. GIN pour JSONB et tableaux
Recherche full-text, filtres sur JSONB fields, arrays : GIN est l'index qui marche.
3. Partial indexes
Filtrez à la création : CREATE INDEX ... WHERE status = 'active'. Économie disque + performance.
4. Composite indexes bien ordonnés
L'ordre des colonnes compte : la plus sélective en premier, sauf besoinORDER BY. Un composite mal ordonné n'est pas utilisé.
5. Covering indexes
INCLUDE pour ajouter des colonnes sans clef : Postgres n'a plus besoin de lire la table. Boost x 3-10 sur les reads.
6. EXPLAIN ANALYZE religieusement
Avant ET après chaque ajout d'index. Vérifiez que Postgres l'utilise vraiment. Un index qui n'apparaît pas dans le plan est un poids mort.
Un bon index est invisible et rapide. Un mauvais index ralentit sans qu'on comprenne pourquoi.
On audite votre base ?
En 30 minutes on peut identifier vos 5 requêtes les plus lentes. Réservez un appel. À lire : Multi-tenant Postgres.