Créa-blog

#100JoursPourCoder
Projet Créa-code

Ressources pour développeur web

Théme de la semaine : MySQL

L’indexation pour accélérer vos requêtes MySQL

Temps de lecture estimé : 12 minutes
Accueil SQL & MySQL L’indexation pour accélérer vos requêtes MySQL

Quand on débute avec MySQL, tout paraît simple : quelques tables, des requêtes de base, et les données s’affichent comme par magie. Puis, un jour, on fait grandir son projet. Une table passe à quelques milliers de lignes, puis quelques centaines de milliers. Et là… les requêtes se traînent, le site rame, les utilisateurs s’impatientent. On a beau optimiser son code PHP, rien n’y fait. La base de données semble en grève. C’est à ce moment qu’intervient l’indexation !

  • Comprendre pourquoi certaines requêtes deviennent lentes et apprendre à les rendre instantanées avec une indexation bien pensée.
  • Savoir quels types d’index utiliser selon les recherches pour éviter les erreurs courantes et optimiser efficacement la base.
  • Être capable d’analyser ses requêtes et de prendre les bonnes décisions pour accélérer un site qui grandit.

La bonne nouvelle, c’est que vous n’avez pas besoin de devenir un expert de l’algorithmique pour accélérer votre base de données MySQL. Il existe un outil puissant, discret, mais redoutablement efficace : l’indexation. Un simple index bien placé peut transformer une requête lente en un éclair quasi-instantané.

Dans ce guide, nous allons prendre le temps de comprendre ce qu’est un index, comment il fonctionne, pourquoi certaines requêtes deviennent lentes, et surtout comment faire les bons choix d’optimisation.

Pourquoi certaines requêtes deviennent lentes ?

Il est impossible d’apprécier l’indexation sans d’abord comprendre pourquoi MySQL fatigue. Reprenons une image très simple. Imaginez que vous avez une petite bibliothèque de dix livres. Vous cherchez un titre particulier : dix secondes plus tard, c’est trouvé. Maintenant, imaginez une bibliothèque avec un million de livres… et aucun classement. Vous devez tout parcourir pour espérer trouver le bon.

MySQL fonctionne de la même manière. Sans index, lors d’une requête du type :

SELECT * FROM clients WHERE email = 'test@gmail.com';

il doit ouvrir chaque ligne de la table, la comparer, puis passer à la suivante. C’est ce qu’on appelle un scan complet de table. Et ça, ce n’est pas du tout optimal.

Plus la table grandit, plus une simple requête devient lente. Ce qui passait inaperçu avec vos 500 premières lignes devient catastrophique avec 500 000.

Aller plus loin : Liste complète des requêtes SQL

L’indexation : votre super-pouvoir MySQL

Un index est une structure de données supplémentaire que MySQL crée pour accélérer la recherche. Pour faire simple : c’est un petit carnet où sont notées les informations les plus utiles pour retrouver une donnée rapidement, sans avoir à fouiller chaque ligne de la table.

Vous avez déjà expérimenté cela au quotidien : le sommaire d’un livre, les pages jaunes, un agenda alphabétique. On ne parcourt jamais tout le livre pour trouver un chapitre. On regarde directement le sommaire, qui nous indique la page. C’est exactement ce que fait MySQL.

Avec un index, la requête précédente devient :

  1. MySQL regarde dans son index où se trouve l’email demandé.
  2. Il récupère directement la bonne ligne.

Résultat : la requête est exécutée en un clin d’œil.

Un premier exemple concret

Supposons une table users avec 150 000 utilisateurs. Vous stockez les emails comme identifiants uniques. La requête suivante doit être extrêmement rapide :

SELECT * FROM users WHERE email = 'contact@site.com';

Si la colonne email n’a pas d’index, MySQL fera un scan complet, ligne par ligne.

Mais en créant un index sur la colonne email :

CREATE INDEX idx_email ON users(email);

Vous indiqué à MySQL : “classe et prépare les emails pour les retrouver à vitesse turbo”.

Vous allez vite prendre l’habitude de dire oui aux index sur les colonnes souvent utilisées dans vos recherches.

Oui mais… pourquoi ne pas indexer toutes les colonnes ?

Ah, la fameuse question que tout le monde se pose à un moment. Si un index accélère les requêtes, pourquoi ne pas en mettre partout ?

Parce qu’un index n’est pas gratuit. Il :

  1. Occupe de l’espace disque
    Une très grosse table avec beaucoup d’index peut devenir encombrante.
  2. Ralentit les opérations d’écriture
    Chaque modification d’une ligne oblige aussi MySQL à mettre à jour l’index.

C’est un peu comme ranger ses chaussures. Si vous essayez d’avoir un classement parfait pour chaque paire de baskets, un classement pour les tongs, un classement pour les lacets… vous passerez plus de temps à ranger qu’à marcher.

Alors, on indexe intelligemment. Seulement ce qui est recherché souvent, et ce qui change peu.

Indexation et requête : comment savoir ce qui doit être indexé

Un bon moyen de remarquer qu’un index manque est tout bête : la lenteur. Mais MySQL a un super outil pour vous le montrer avant la catastrophe : EXPLAIN.

Au lieu de lancer une requête trop lourde les yeux fermés, on fait :

EXPLAIN SELECT * FROM users WHERE email='contact@site.com';

MySQL vous dira si la requête scanne toute la table (“ALL”), ou s’il utilise un index. C’est un indicateur précieux pour traquer les goulots d’étranglement.

Quelques cas pratiques d’indexation

Pour comprendre vraiment ce qui se passe, je vous propose trois mini-scénarios très différents, qu’on retrouve dans la vraie vie :

  1. Vous recherchez un utilisateur par son email
  2. Vous listez des commandes par ID client
  3. Vous filtrez les articles par catégorie et date de publication

Dans chaque cas, l’indexation n’a pas le même rôle, mais elle permet de réduire drastiquement le temps de recherche.

Prenons le deuxième cas : les commandes. Votre table s’appelle orders et contient potentiellement des millions d’entrées. Vous cherchez toutes les commandes d’un client précis :

SELECT * FROM orders WHERE client_id = 673;

Indexation idéale :

CREATE INDEX idx_orders_client ON orders(client_id);

Vous aidez ainsi MySQL à accéder directement aux lignes utiles, sans lire toutes les commandes du monde.

Lors de la création du site d’une boutique artisanale (rien de gigantesque au départ), la base comptait seulement 120 produits. L’affichage des listes allait très vite. Puis, l’entreprise a commencé à publier 50 nouveaux produits par jour. Après quelques mois, la base dépassait les 10 000 produits et chaque requête était devenue lente. Ce qui semblait un problème de serveur était en fait seulement un manque d’index. Après avoir ajouté deux index très simples, les temps de réponse ont été divisés par 80. Comme quoi, un détail peut transformer un projet.

Ce qu’il faut comprendre avant d’aller plus loin

Nous avons posé les bases :

  • Les requêtes deviennent lentes lorsque MySQL scanne toute la table
  • L’indexation permet de trouver les résultats plus vite
  • Il faut indexer uniquement ce qui est utile
  • EXPLAIN aide à identifier les requêtes à optimiser

Mais nous n’avons encore vu qu’une partie de l’histoire. Car il existe différents types d’index, et différentes techniques de recherche. Certains index accélèrent les requêtes sur une colonne. D’autres optimisent les recherches sur plusieurs colonnes à la fois. Certains sont uniques, d’autres autorisent les doublons. Et bien sûr, MySQL propose des index spécialisés pour les recherches en texte intégral, pour les clés primaires, pour les tris rapides, etc.

Découvrir les différents types d’index

Maintenant que nous avons compris pourquoi l’indexation rend les requêtes MySQL beaucoup plus rapides, il est temps d’entrer dans le concret. Tous les index ne fonctionnent pas de la même manière. Selon vos besoins, vous utiliserez différents types d’index pour optimiser vos recherches.

Commençons en douceur, car vous allez voir que c’est finalement assez logique.

L’index simple : votre allié du quotidien

L’index simple, c’est le plus basique. Il porte sur une seule colonne. Vous l’avez déjà vu avec l’email d’un utilisateur ou l’id d’un client.

La syntaxe est minimale :

CREATE INDEX idx_nom ON ma_table(nom_colonne);

Vous pouvez aussi créer un index dès la création de votre table :

CREATE TABLE produits (
    id INT PRIMARY KEY,
    nom VARCHAR(255),
    prix DECIMAL(10,2),
    INDEX idx_nom(nom)
);

Cet index permettra d’accélérer toutes les requêtes du type :

SELECT * FROM produits WHERE nom = 'Chaise en bois';

ou même

SELECT * FROM produits ORDER BY nom;

Parce que oui, l’index n’aide pas uniquement à filtrer. Il accélère aussi les tris. C’est une information importante à garder en tête.

L’index unique : l’ange gardien de vos données

Un index simple permet d’accélérer les requêtes. Mais un index unique ajoute un deuxième super-pouvoir : il empêche les doublons.

Par exemple, vous ne voulez jamais avoir deux comptes avec le même email. Alors, au lieu de créer seulement un index simple, vous créez un index unique :

CREATE UNIQUE INDEX idx_email_unique ON users(email);

MySQL refusera toute insertion d’un email déjà présent dans la base. Cela évite de devoir vérifier en PHP avant chaque ajout.

C’est la même logique pour un numéro de client, un numéro de facture, un nom d’utilisateur, etc.

Les index composés : le secret de la vitesse sur plusieurs conditions

Souvent, vos requêtes ne filtrent pas seulement sur une colonne, mais sur plusieurs. Exemple très courant :

SELECT * FROM articles
WHERE categorie = 'voyage'
AND date_publication >= '2025-01-01'
ORDER BY date_publication DESC;

Dans un cas comme celui-ci, les index simples ne suffisent pas toujours. MySQL a besoin de comprendre la relation entre les deux colonnes. Il faut donc créer un index composé, aussi appelé index multi-colonnes.

Voici comment faire :

CREATE INDEX idx_cat_date ON articles(categorie, date_publication);

Ici, l’ordre des colonnes est très important. Il doit suivre la logique de vos requêtes. Si vous interrogez surtout par catégorie puis par date, alors cet ordre est parfait.

Cet index va accélérer les recherches, mais aussi le tri sur la date, car MySQL n’aura plus besoin de commander toutes les lignes à la main.

Une règle à ne jamais oublier avec les index composés

Un index composé ne peut vraiment aider que si la première colonne de l’index est utilisée dans la requête. C’est une règle essentielle.

Avec notre index idx_cat_date(categorie, date_publication) :

Fonctionne très bien :

WHERE categorie = 'voyage'
AND date_publication > '2025-01-01'

Fonctionne un peu moins bien :

WHERE date_publication > '2025-01-01'

Dans ce second cas, MySQL ne peut pas exploiter l’index au maximum, car il ne commence pas par la colonne catégorie.

Cette règle simple évite bien des incompréhensions.

L’index FULLTEXT : le héros de la recherche textuelle

Lorsque vous cherchez un mot ou une expression dans un gros texte, un index classique devient inutile. Imaginez un champ texte contenant des descriptions de plusieurs milliers de caractères, comme sur un blog ou une boutique. Impossible d’indexer chaque mot individuellement.

C’est ici que l’index FULLTEXT fait son entrée.

Il permet d’optimiser les requêtes du style :

SELECT * FROM articles
WHERE MATCH(contenu) AGAINST('voyage en Asie');

MySQL est capable de comprendre les mots, d’évaluer leur priorité, et d’effectuer des recherches très performantes sur des textes volumineux.

Pour créer l’index :

CREATE FULLTEXT INDEX idx_contenu ON articles(contenu);

Cet index n’est disponible que sur certains moteurs de stockage, notamment InnoDB et MyISAM. Aujourd’hui, InnoDB est le standard recommandé.

Index et clés primaires : un lien indissociable

Chaque table possède (normalement) une clé primaire. Par exemple, l’id de votre utilisateur. Ce champ est automatiquement indexé.

Vous n’avez pas besoin d’ajouter un index sur une colonne déjà utilisée en PRIMARY KEY. Ce serait juste redondant.

Exemple classique :

id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY

C’est un index unique parfait. MySQL peut retrouver une ligne par id en une fraction de seconde.

Comment savoir si un index est vraiment utilisé ?

Une indexation ne sert à rien si MySQL n’en tire pas partie. C’est ici que EXPLAIN devient votre meilleur ami.

Par exemple :

EXPLAIN SELECT * FROM orders WHERE client_id = 80;

Dans le résultat, une colonne appelée key vous montrera quel index MySQL utilise. Si vous voyez NULL, c’est que MySQL a décidé de s’en passer.

Et contrairement à ce qu’on pourrait croire, c’est parfois logique. Il arrive que MySQL privilégie un scan complet si la condition filtre un trop grand nombre de lignes. Nous en parlerons plus loin dans les bonnes pratiques.

Le coût de l’indexation : attention à l’écriture

Nous l’avons déjà évoqué, mais il faut insister. Un index accélère les recherches, mais ralentit les insertions, les suppressions et les mises à jour.

Si vous avez une table qui change constamment, avec plusieurs écritures par seconde, trop d’index peut devenir un fardeau.

Il faut alors trouver un équilibre. On ne veut pas de requêtes lentes, mais on ne veut pas non plus d’un serveur qui rame dès qu’on insère une ligne.

La règle d’or :

Indexez seulement ce qui est vraiment utile à vos requêtes.

Une petite erreur courante à éviter

Beaucoup de débutants, suite à un tuto, ajoutent un index sur chaque colonne utilisée dans WHERE. Mais toutes les conditions WHERE ne se valent pas.

Formation web et informatique - Alban Guillier - Formateur

Des formations informatique pour tous !

Débutant ou curieux ? Apprenez le développement web, le référencement, le webmarketing, la bureautique, à maîtriser vos appareils Apple et bien plus encore…

Formateur indépendant, professionnel du web depuis 2006, je vous accompagne pas à pas et en cours particulier, que vous soyez débutant ou que vous souhaitiez progresser. En visio, à votre rythme, et toujours avec pédagogie.

Découvrez mes formations Qui suis-je ?

Par exemple :

SELECT * FROM logs WHERE date_creation > '2025-12-01';

Si plus de 90 % des lignes correspondent à cette condition, MySQL va de toute façon devoir lire presque toute la table. Résultat : même indexée, la requête restera lente.

L’index sert uniquement si la requête est sélective, c’est-à-dire si elle réduit réellement le nombre de lignes à lire.

Vous savez désormais :

  • Qu’il existe plusieurs types d’index
  • Que leur impact dépend des requêtes
  • Que l’ordre et la sélectivité changent tout
  • Que l’écriture est plus lente lorsqu’il y a trop d’index
  • Que EXPLAIN aide à vérifier l’efficacité

Petit à petit, vous êtes en train de devenir le genre de personne qui ne se laisse jamais surprendre par des requêtes catastrophiques. C’est un super pouvoir dans le monde du développement web !

Les bonnes pratiques pour une indexation efficace

Vous savez maintenant créer des index simples, uniques, composés ou FULLTEXT. Mais avant de se précipiter dans votre base de données pour tout indexer, il est crucial de se poser les bonnes questions. Une indexation mal pensée peut faire plus de mal que de bien.

Pour vous aider, voici les principes essentiels qui guident les professionnels lorsqu’ils optimisent leurs requêtes.

Indexer les colonnes souvent utilisées dans WHERE

Nous l’avons déjà abordé : un index ne sert vraiment que lorsqu’une requête filtre les résultats. Si vous interrogez souvent votre base sur l’email, la date d’inscription, la catégorie ou n’importe quel autre champ, alors l’indexation est certainement nécessaire.

Exemple concret d’un site e-commerce :

SELECT * FROM produits WHERE categorie = 'chaussures';

Vous pouvez être sûr que cette condition reviendra souvent.

Dans ce cas, un index sur categorie est indispensable :

CREATE INDEX idx_cat ON produits(categorie);

Cela peut suffire à transformer une requête trop longue en une réponse quasi instantanée.

Indexer aussi les champs utilisés dans ORDER BY et JOIN

MySQL doit souvent trier ou faire correspondre des lignes lors de jointures, ce qui peut coûter du temps.

Une requête de ce genre, par exemple :

SELECT * FROM commandes
JOIN clients ON commandes.id_client = clients.id
ORDER BY commandes.date_creation DESC;

bénéficiera d’au moins deux index :

  • un sur commandes.id_client
  • un sur commandes.date_creation

Chaque index permet d’éviter un tri complet ou une comparaison ligne par ligne.

D’ailleurs, si vous utilisez beaucoup de jointures, vous verrez vite que vous n’avez plus peur d’eux. MySQL n’est pas allergique aux JOIN, il est allergique aux JOIN sans index.

Utiliser EXPLAIN régulièrement : analyser, ne jamais deviner

Dans un projet en évolution, des requêtes qui étaient rapides peuvent devenir lentes au fil du temps.

Peut-être qu’au départ, une table ne contenait que 200 lignes, alors le scan complet passait inaperçu. Puis soudain, il y en a 100 000, et la requête explose.

Avant de créer un index, il faut donc écouter MySQL :

EXPLAIN SELECT ...

Grâce à cette commande, vous verrez :

  • si un index est utilisé
  • combien de lignes sont parcourues
  • si un tri coûteux est nécessaire
  • à quel point la requête est sélective

Cet réflexe permet d’éviter l’indexation “à l’aveugle”.

Ne jamais indexer les colonnes qui changent sans arrêt

Si vous modifiez des données à chaque seconde (par exemple un compteur de vues), un index pourrait ralentir les écritures de façon significative sans vraiment accélérer les requêtes.

Par exemple, si vous stockez les vues d’un article :

UPDATE articles SET vues = vues + 1 WHERE id = 15;

Index sur vues = très mauvaise idée.

Un index doit favoriser la lecture, pas bloquer la fluidité du site en écriture.

Attention aux champs comportant beaucoup de doublons

Imaginez une table avec une colonne sexe, contenant uniquement “H” ou “F”. Ce champ est très peu sélectif : un index serait quasiment inutile. La plupart des requêtes devront quand même fouiller une grosse partie de la table.

Index sur sexe = bof.

À l’inverse, un email ou un numéro de client est très sélectif : l’index fera merveille.

Index sur email = parfait.

En bref :

Plus une colonne contient de valeurs différentes, plus un index est utile.

Indexer plusieurs colonnes : oui, mais avec une stratégie

Nous avons vu l’importance de l’ordre des colonnes dans un index composé. Mais ce n’est pas tout. Il est souvent préférable d’avoir un bon index composé plutôt que plusieurs index simples.

Prenons une table logs :

SELECT * FROM logs
WHERE type = 'erreur'
AND date_event >= '2025-12-01';

Un index idéal serait :

CREATE INDEX idx_type_date ON logs(type, date_event);

Ajouter deux index séparés type et date_event serait moins performant dans ce type de requête. Un seul index qui correspond à la réalité des requêtes est toujours gagnant.

L’impact du LIKE et des recherches partielles

Les débuts de requête avec LIKE peuvent utiliser des index :

WHERE nom LIKE 'Mar%'

Mais dès que vous mettez un joker au début :

WHERE nom LIKE '%ar'

l’index devient inutile, car MySQL ne peut plus deviner le début du mot. Il doit parcourir toutes les lignes.

Même chose avec :

WHERE telephone LIKE '%123%'

Ce type de requête restera coûteux. Un index FULLTEXT peut aider, selon le contexte.

Tester les performances avant et après : la vérité est dans les chiffres

Parfois, on pense qu’un index va tout changer… mais MySQL avait déjà une optimisation en réserve. Ou l’inverse : on pensait la requête rapide, et elle tombe de sa chaise.

Vous pouvez mesurer le temps d’exécution d’une requête directement avec MySQL :

SET profiling = 1;
SELECT ... ;
SHOW PROFILES;

Cela montre combien de millisecondes la requête consomme. C’est idéal pour valider vos améliorations. N’hésitez pas à comparer avant et après chaque index.

Ne pas indexer toutes vos colonnes “par sécurité”. Chaque insertion pourrait prendre… une seconde. Sur une base qui reçoit 500 inserts par minute, ça serait le chaos. Vous pourriez penser optimiser, mais MySQL passerait son temps à mettre à jour les index.

Vous êtes presque prêt à indexer comme un pro

Nous avons maintenant une stratégie solide :

  • Index sélectif
  • Analyse EXPLAIN obligatoire
  • Attention aux écritures fréquentes
  • Réfléchir avant d’indexer une colonne
  • Choisir entre index simple ou composé selon les requêtes
  • Vérifier les performances après chaque optimisation

Indexation et requête : appliquer tout cela dans un vrai projet

Théorie bien comprise, place à la pratique. Imaginons un site réel, avec une base structurée autour de trois tables principales : users, commandes, produits. Au fil du temps, les données ont explosé : plusieurs centaines de milliers de lignes. Les utilisateurs se plaignent que les pages mettent trois secondes à charger. Il est temps de reprendre le contrôle.

Étape 1 : identifier les requêtes lentes

Le premier réflexe consiste à analyser ce qui bloque. Et non, on ne devine pas, on mesure. MySQL met à disposition un outil précieux : le slow query log.

Une fois activé, ce journal liste toutes les requêtes qui dépassent un temps d’exécution fixé, par exemple 1 seconde. C’est la loupe dont vous aviez besoin pour repérer l’ennemi.

Disons que vous tombez sur une requête comme :

SELECT * FROM commandes
WHERE id_client = 217
ORDER BY date_commande DESC
LIMIT 20;

Sans index, MySQL lit toutes les commandes du monde avant de trier. Pas étonnant que ça prenne du temps.

Étape 2 : analyser avec EXPLAIN

Avant d’ajouter le moindre index, on teste :

EXPLAIN SELECT * FROM commandes
WHERE id_client = 217
ORDER BY date_commande DESC;

Si dans la colonne type vous voyez “ALL”, c’est mauvais signe : scan complet de la table. La colonne rows indique le nombre approximatif de lignes parcourues. Si ce chiffre dépasse les dizaines de milliers, votre requête souffre vraiment.

Étape 3 : créer un index adapté

Dans cet exemple, deux conditions et un tri sont utilisés. L’index idéal combine les deux colonnes :

CREATE INDEX idx_client_date
ON commandes(id_client, date_commande);

Bien sûr, on prend soin de respecter l’ordre logique de la requête.

Une fois l’index créé, on relance EXPLAIN. Si MySQL indique maintenant l’utilisation de idx_client_date dans la colonne key, vous venez d’offrir un shot de café à votre base de données.

Étape 4 : valider les gains de performance

Il ne suffit pas d’espérer, il faut vérifier. Pour cela, vous pouvez exécuter plusieurs fois la requête avant et après, et mesurer le temps moyen. Si on passe de 2,3 secondes à moins de 30 millisecondes, vous avez gagné la bataille.

Il arrive que certains index ne donnent que des améliorations modestes. Parfois même, ils ne servent finalement à rien. C’est pour cela que l’on mesure toujours avant et après, pour prendre des décisions basées sur des faits.

Étape 5 : documenter les index

Ce point est trop souvent négligé. Si votre équipe travaille à plusieurs, ou si vous revenez sur le projet dans 6 mois, vous serez heureux de comprendre pourquoi tel index a été créé.

Parfois, on supprime un index “inutile” alors qu’il était vital pour une requête oubliée. Alors, une petite note dans votre documentation, c’est un cadeau pour vous-même.

Comment savoir si vous avez trop d’index ?

C’est une bonne question, car l’indice le plus visible n’est pas toujours celui auquel on pense. Soudain, les INSERT deviennent de plus en plus lents. Dans phpMyAdmin ou Adminer, vous remarquez que les pages d’admin mettent du temps à s’afficher. MySQL consacre trop d’énergie à mettre à jour ses structures secondaires.

Si vous observez ce symptôme, faites le ménage : désindexez ce qui ne sert à rien.

Prioriser les index dans les colonnes les plus discriminantes

Une requête comme :

SELECT * FROM utilisateurs WHERE pays = 'France';

peut encore retourner des dizaines de milliers de lignes. Si vous combinez pays + ville dans un index :

CREATE INDEX idx_pays_ville ON utilisateurs(pays, ville);

vous obtenez une sélection beaucoup plus précise. Et donc beaucoup plus rapide. L’idée est toujours la même : laisser l’indexation réduire intelligemment le nombre de lignes à parcourir.

Bien utiliser l’indexation dès le début

L’erreur que font beaucoup de développeurs débutants : se dire que l’indexation, c’est pour plus tard. Sauf que lorsqu’un site grandit, on finit par manquer de temps. Les lenteurs s’installent et tout le monde accuse le serveur, le framework, ou même le développeur qui a mis trop d’images sur la page.

Alors que souvent… une seule ligne SQL aurait suffi à rendre le site fluide.

Passer quelques minutes à penser aux requêtes les plus importantes est un investissement. Cela évite de devoir réparer les dégâts lorsque la base contient déjà un million de lignes.

Et si MySQL n’utilise pas l’index ?

Cela peut arriver. Parfois, MySQL estime qu’un scan complet est plus rapide car le filtre ne sélectionne pas assez ou peu de lignes. D’où l’importance de créer des index uniquement lorsque les requêtes sont vraiment sélectives.

D’autres fois, le LIKE ou le mauvais ordre dans un index composé pousse MySQL à ignorer un index qui semblait pourtant excellent.

Dans ces cas-là, EXPLAIN sera encore une fois votre meilleur allié.


L’indexation, l’ingrédient secret des bases performantes

Vous voilà maintenant armé pour affronter l’un des grands défis du développement web : faire en sorte que les requêtes restent rapides, même lorsque la base grossit sans prévenir. Vous avez découvert comment MySQL pense, comment il parcourt ses données, comment il choisit l’index le plus adapté, et surtout comment le guider pour éviter qu’il ne se fatigue.

Ce que j’aimerais que vous reteniez, au-delà de la théorie, c’est l’état d’esprit. Optimiser une base de données, ce n’est pas un don réservé aux experts. C’est une façon de poser les bonnes questions au bon moment. Comment cette requête fonctionne réellement ? Pourquoi celle-ci est-elle lente ? Comment puis-je l’aider à sélectionner mieux ?

À présent, vous possédez les réponses essentielles. Vous pouvez appliquer ces techniques progressivement, avec calme et méthode. Et le jour où vous verrez une requête passer de 4 secondes à 20 millisecondes, vous comprendrez pourquoi l’indexation est l’un des outils les plus satisfaisants du métier. Votre futur vous remerciera, et vos utilisateurs aussi.