Partir de la requête lente réelle, pas d’une liste de colonnes
Un index utile naît d’un parcours e-commerce observé : recherche catalogue, disponibilité par entrepôt, panier, commande ou rapprochement. Le créer parce qu’une colonne revient souvent dans les filtres confond fréquence et sélectivité. Commencez par recueillir la requête paramétrée, sa durée, les lignes retournées, sa fréquence, son contexte transactionnel et la version applicative. Conservez aussi la distribution des paramètres et les périodes de pointe, car le même SQL peut réagir très différemment pour une commande précise et une longue plage de dates.
Figer la forme et le contexte de la requête
Masquez les valeurs sensibles dans les échantillons sans perdre types, prédicats, tris, jointures ni limites. Vérifiez si l’application envoie la forme prévue ou génère des variantes qui empêchent la réutilisation. Notez concurrence, cache chaud ou froid et volume des tables. La première question n’est pas « quel index manque ? », mais « quel accès coûte cher, avec quels paramètres et quel impact sur le parcours client ? »
Lire EXPLAIN comme une hypothèse de l’optimiseur
EXPLAIN présente le plan choisi : ordre des opérations, méthodes d’accès, jointures, tris et estimations. Repérer un parcours complet de table ne suffit pas. Sur une petite table ou lorsque la requête demande une grande partie des lignes, une lecture séquentielle peut être rationnelle. Recherchez plutôt les nœuds qui amplifient le travail : beaucoup de lignes traitées pour peu de résultats, tris évitables, jointures alimentées par une mauvaise cardinalité ou filtres appliqués trop tard.
PostgreSQL affiche coûts et estimations par nœud ; MySQL documente EXPLAIN pour montrer comment les instructions sont exécutées. Leurs représentations et leurs coûts ne sont pas interchangeables. Maintenez une grille de lecture pour le moteur et la version réellement déployés, sans comparer directement les chiffres de produits différents.
Distinguer estimations et valeurs observées
L’écart entre lignes estimées et réelles est souvent plus révélateur qu’un temps isolé. Il peut signaler des statistiques anciennes, des données très déséquilibrées, des colonnes corrélées ou des paramètres peu représentatifs. Avant d’ajouter un index, actualisez les statistiques avec la procédure habituelle du moteur et répétez le plan sur le même échantillon. Si l’estimation reste fausse, documentez la distribution et envisagez des statistiques plus adaptées ou une réécriture prudente, plutôt que d’ajouter automatiquement un index.
Employer EXPLAIN ANALYZE dans un cadre contrôlé
Un plan mesuré révèle lignes réelles, boucles et temps des nœuds, mais l’instruction est exécutée. Ne l’essayez pas sans préparation sur une instruction de modification des données ou une requête de production coûteuse. Reproduisez données et paramètres représentatifs, fixez des limites de temps, surveillez charge et verrous et convenez d’une fenêtre pour les vérifications indispensables en production. Pour les instructions qui modifient des données, annuler une transaction peut aider dans certains cas, sans neutraliser tous les effets externes ou fonctions à effet de bord.
Comparez au moins un plan de référence et un plan candidat. Gardez paramètres, volume et état du cache aussi constants que possible. Une seule durée plus basse ne prouve pas un gain durable : le résultat doit convenir aux principales formes de charge sans transférer un coût excessif aux écritures, aux répliques ou à la maintenance.
Déduire l’ordre d’un index composite des prédicats
Dans un B-tree multicolonne, l’ordre des clés influence la zone de l’index que le moteur peut parcourir de façon ciblée. PostgreSQL décrit le rôle des égalités sur les premières colonnes et de la première inégalité suivante, ainsi que des optimisations dont l’application varie. Partez donc des égalités, intervalles, jointures et tris réels. N’appliquez pas aveuglément « la colonne la plus sélective d’abord » : inspectez les plans des combinaisons importantes et les possibilités de réutilisation.
Évitez les quasi-doublons. Un index composite peut servir certains accès utilisant son préfixe, mais les moteurs ne traitent pas de la même façon colonnes sautées, direction du tri et prédicats. Listez les requêtes bénéficiaires et celles volontairement exclues, puis confirmez que le candidat ne copie pas un index existant avec un seul champ supplémentaire.
Les index couvrants et filtrés dépendent du moteur
Un index couvrant conserve les clés de recherche et des données supplémentaires nécessaires à une requête, afin de réduire les accès à la structure principale. Les détails diffèrent. Dans SQL Server, les colonnes incluses ne sont pas des colonnes clés et le guide déconseille les index trop larges ; les autres moteurs imposent d’autres syntaxes et conditions. Un index filtré SQL Server ne contient que les lignes conformes à un prédicat et n’est utile que si ce prédicat reflète la charge. Ne transposez pas mécaniquement cette technique vers PostgreSQL ou MySQL : concevez et testez l’option native.
Intégrer le coût des écritures et de la construction
Chaque index ajoute du travail aux insertions, aux suppressions et aux mises à jour qui modifient les données qu’il contient ; le coût des autres mises à jour dépend du moteur. Sur paniers, stocks et commandes, une lecture accélérée peut augmenter latence d’insertion ou de mise à jour, journalisation, espace, pression sur le cache et travaux de maintenance. Avant le déploiement, notez taille attendue, volume d’écritures affectant les colonnes concernées et impact sur le chemin critique. Un index large sur une table fréquemment modifiée demande une justification plus forte qu’une structure compacte sur des données stables.
La construction elle-même est une opération à planifier. Vérifiez les options en ligne ou concurrentes de la version utilisée, la durée estimée, l’espace temporaire, les effets sur la réplication et les modalités d’annulation. « En ligne » ne signifie pas absence totale de verrous ni de consommation. Consultez la documentation du moteur et définissez des seuils d’arrêt.
Gérer plans et index sur tout leur cycle de vie
Associez à chaque index un propriétaire, des requêtes cibles, une hypothèse, une date de révision et des indicateurs. Mesurez latence par percentile, lignes examinées par rapport aux lignes retournées, fréquence du plan, lectures, écritures et croissance. Conservez des empreintes de plans pour détecter les variations après croissance des données, rafraîchissement des statistiques ou changement de version. Un plan différent n’est pas automatiquement une régression ; reliez-le au coût et au résultat de la charge.
Retirer un index inutilisé sans raccourci
Un compteur à zéro ne suffit pas : un redémarrage peut l’avoir réinitialisé et des traitements mensuels, procédures d’urgence ou contraintes peuvent échapper à l’observation. Couvrez un cycle commercial pertinent, vérifiez unicité et relations, recherchez l’index dans l’historique des plans et consultez les responsables. Si le moteur le permet, testez le passage de l’index en mode invisible ou sa désactivation dans un environnement contrôlé ; sinon préparez un retrait réversible avec définition conservée, DDL archivée et surveillance immédiate.
Déployer une seule modification de base à la fois
Créez l’index, actualisez les statistiques et comparez les plans sans réécrire simultanément la requête. Procédez par étapes en observant le cas cible, les écritures et les requêtes voisines. Fixez les conditions de retour arrière : croissance d’une file, latence des opérations d’écriture, pression de stockage ou dégradation d’un plan fréquent. Si l’optimiseur choisit toujours un autre chemin, n’imposez pas immédiatement un hint durable ; revérifiez estimations, types, prédicats et bénéfice attendu.
Mesurer le résultat et garder un ensemble d’index ciblé
Le succès n’est pas « l’index est utilisé », mais moins de travail pour une requête importante à un coût acceptable. Comparez latence, lignes traitées, consommation CPU et opérations d’E/S, verrous et débit d’écriture sur des fenêtres équivalentes. Réexaminez périodiquement chevauchements, croissance et plans. Pour transformer analyse, déploiement et maintenance en pratique vérifiable, découvrez nos services pour les systèmes numériques et l’e-commerce. Un portefeuille réduit, justifié et observé reste plus fiable qu’une collection créée après chaque pic.
Questions fréquentes
Un parcours complet dans le plan signifie-t-il toujours qu’un index manque ?
Non. Il peut être efficace sur une petite table ou si une grande part des lignes est demandée. Évaluez cardinalité, lignes traitées, sélectivité et coût du plan complet.
Quand peut-on utiliser EXPLAIN ANALYZE en sécurité ?
Lorsque vous acceptez l’exécution, disposez de données et paramètres représentatifs, de limites de temps et de charge, d’une surveillance et d’une stratégie prudente pour les effets de bord.
Comment ordonner les colonnes d’un index composite ?
Partez des égalités, intervalles, jointures et tris des requêtes réelles, puis examinez les plans des principaux paramètres. Aucune règle unique de sélectivité ne remplace la mesure.
Quand retirer un index apparemment inutilisé ?
Après une observation couvrant les cycles utiles, la vérification des contraintes et requêtes rares, la consultation des responsables et la préparation d’un changement réversible.
Articles connexes
Pooling de connexions ecommerce : dimensionnement, délais et capacité
Une méthode opérationnelle pour répartir le budget de connexions, maîtriser les files et éviter qu'un pic de checkout transforme le pool en amplificateur de panne.
Partitionnement ecommerce : élagage, points chauds et rétention des données
Partitionner commandes et événements selon les requêtes réelles, vérifier l’élagage, piloter la rétention et éviter surcharge et points chauds.
Migrations de base de données e-commerce sans interruption : expand-contract et backfill
Une méthode pour faire évoluer le schéma pendant que commandes et paiement restent actifs : ajouts compatibles, backfill par lots, contrôles et retrait prudent.
