learn.chetana.fr

Performance : lire EXPLAIN et choisir ses index

15 min readCore

EXPLAIN ANALYZE : mesurer, ne pas deviner

Face Ă  une requĂȘte lente, l'intuition ment (cours ML : « mesure, ne devine pas »). Le seul juge : le plan d'exĂ©cution rĂ©el.

EXPLAIN (ANALYZE, BUFFERS) SELECT 
 ;

Les nƓuds à reconnaütre, du pire au meilleur selon le contexte :

  • Seq Scan : lecture de toute la table. Catastrophe sur 10 M de lignes filtrĂ©es, mais optimal si on lit 90 % de la table (l'index coĂ»terait plus cher) ;
  • Index Scan / Index Only Scan : l'index guide (l'Only ne touche mĂȘme pas la table — index couvrant) ;
  • Bitmap Heap Scan : entre les deux, pour une sĂ©lectivitĂ© moyenne ;
  • Nested Loop / Hash Join / Merge Join : les trois stratĂ©gies de jointure — le planner choisit selon les volumes.

Les deux chiffres qui comptent : l'Ă©cart estimĂ© vs rĂ©el (rows=100 estimĂ©, actual rows=90000 → statistiques pĂ©rimĂ©es, ANALYZE la table) et le temps par nƓud (oĂč part le budget). Un Seq Scan en haut d'une requĂȘte Ă  3 s sur une grosse table = ton coupable habituel.

Les familles d'index (chacune son usage)

IndexPourExemple du projet
B-tree (défaut)égalité, ordre, plagesWHERE id = 
, ORDER BY created_at
GINcontenu « many values »JSONB (extensions), full-text (tsvector), trigram
HNSW (pgvector)plus proches voisins vectorielssearch_vec <=> :emb (recherche sémantique)
partielsous-ensemble filtrĂ©WHERE statut = 'pending' — index petit et ciblĂ©
compositefiltres multi-colonnes(tenant_id, created_at) — l'ordre des colonnes compte !

RÚgle du composite : la colonne la plus sélective et filtrée par égalité en premier, celle qui ordonne ensuite ((tenant_id, created_at) sert WHERE tenant_id=
 ORDER BY created_at).

Le coût caché des index

Un index accĂ©lĂšre les lectures mais ralentit chaque Ă©criture (il faut le maintenir) et occupe de l'espace. D'oĂč la discipline : indexer les colonnes rĂ©ellement filtrĂ©es/triĂ©es en prod (l'EXPLAIN le dit), pas « au cas oĂč ». Et surveiller les index inutilisĂ©s (pg_stat_user_indexes) — un index jamais scannĂ© est un coĂ»t d'Ă©criture pur.

đŸ§© Quiz1/4

Un Seq Scan est-il toujours un problĂšme ?

🃏 Flashcards1/4