Limiter le travail par requête
Objectif : Réduire les données chargées en appliquant une pagination et en sélectionnant uniquement les colonnes nécessaires.
Une liste de contacts peut devenir lente même si la requête est correctement préparée et si un index est adapté. Si la page charge des milliers de lignes, ou toutes les colonnes alors qu’elle n’en affiche que quelques-unes, la base, PHP et le réseau traitent du travail inutile. Vous allez réduire ce travail en limitant le nombre de résultats et les données transférées pour chacun.
La leçon « Choisir un index adapté » vous a montré comment étudier un filtre réel et vérifier son plan d’exécution. Ici, l’objectif est différent : même avec un filtre efficace, vous ne devez pas renvoyer à l’application plus de lignes ou de colonnes qu’elle n’en utilise. La pagination répartit une liste en pages successives ; la sélection ciblée réduit les données de chaque ligne.
Limiter le nombre de résultats
En SQL, LIMIT fixe le nombre maximal de lignes renvoyées. OFFSET indique combien de lignes ignorer avant de commencer à renvoyer des résultats. Pour afficher 20 contacts à la première page, vous demandez les 20 premières lignes ; pour la page suivante, vous ignorez ces 20 premières lignes et demandez les 20 suivantes. Une pagination exige un ordre stable : sans ORDER BY, la base n’a pas à renvoyer les lignes dans un ordre prévisible.
SELECT id, nom, courriel, telephone
FROM contacts
ORDER BY nom ASC, id ASC
LIMIT 20 OFFSET 0;SELECT id, nom, courriel, telephone
FROM contacts
ORDER BY nom ASC, id ASC
LIMIT 20 OFFSET 20;Le deuxième critère de tri, id, départage les contacts qui ont le même nom et rend l’ordre déterministe. Pour une page de taille taille et numérotée à partir de 1, l’offset vaut (numéro de page - 1) × taille. La taille et l’offset doivent être des entiers validés avant de construire la requête ; refusez les numéros de page nuls, négatifs ou excessivement grands, et imposez une taille maximale.
Choisir les colonnes utiles
Évitez SELECT * dans une requête utilisée par une page. La liste affiche le nom, le courriel et le téléphone, et les actions de modification et de suppression ont besoin de l’identifiant : ces quatre colonnes suffisent à ce résultat. Si une autre opération a besoin d’autres données, elle doit demander les colonnes correspondantes plutôt que de charger systématiquement toute la ligne.
SELECT id, nom, courriel, telephone
FROM contacts
ORDER BY nom ASC, id ASC
LIMIT 20 OFFSET 0;Une sélection précise rend aussi le résultat plus clair pour le code qui le consomme : les champs récupérés correspondent aux besoins de l’écran, et une modification du schéma ne fait pas apparaître automatiquement des données supplémentaires dans cette réponse. Dans le dépôt PDO, conservez des requêtes préparées comme dans la leçon « Neutraliser les injections SQL ». La pagination ne remplace pas cette protection : elle contrôle le volume, pas la sécurité des valeurs transmises à la base.
Connaître les limites de l’offset
Avec un offset important, la base peut devoir parcourir puis ignorer de nombreuses lignes avant de renvoyer la page demandée. Cette approche convient souvent aux carnets de volume modéré et permet de naviguer directement vers une page connue, mais elle peut coûter davantage quand la liste grossit. En outre, si des contacts sont ajoutés ou supprimés entre deux demandes, les limites entre pages peuvent se déplacer ; un résultat peut alors être répété ou manqué.
Pour des volumes élevés ou une navigation où les données changent fréquemment, une pagination par curseur peut être plus adaptée. Elle reprend la dernière valeur observée, par exemple le couple nom et id, et demande les lignes qui viennent après ce couple dans l’ordre choisi. Cette stratégie réduit la dépendance à un offset lointain, mais demande une conception cohérente entre le tri, le filtre et la condition de reprise ; vous n’avez pas besoin de l’introduire sans mesure qui le justifie.
À retenir
- Utilisez LIMIT et OFFSET pour borner le nombre de lignes renvoyées, avec un ordre stable et un départage explicite.
- Validez le numéro de page et imposez une taille maximale ; ne construisez pas ces valeurs par concaténation non contrôlée.
- Sélectionnez uniquement les colonnes nécessaires à l’opération, plutôt que d’utiliser SELECT *.
- Mesurez les requêtes représentatives et envisagez une pagination par curseur si les offsets élevés deviennent coûteux.
Dans la suite, vous assemblerez les composants du carnet pour servir une liste de contacts protégée par authentification.