Pagination MySQL : récupérer efficacement les résultats et le nombre total
Lors de l'implémentation de la pagination dans MySQL, il est courant d'effectuer deux requêtes distinctes : une à obtenir le nombre total de résultats et un autre pour limiter les enregistrements récupérés. Cette approche, connue sous le nom de double requête, peut s'avérer inefficace pour les grands ensembles de données.
Cependant, la question se pose de savoir s'il est possible de récupérer à la fois le nombre total de résultats et de limiter les résultats dans une seule requête. Bien qu'il n'existe aucun moyen direct d'y parvenir, deux méthodes alternatives sont disponibles :
SQL_CALC_FOUND_ROWS et FOUND_ROWS()
Au lieu d'effectuer une double requête, vous pouvez utiliser SQL_CALC_FOUND_ROWS et FOUND_ROWS() pour obtenir un résultat similaire. La requête avec SQL_CALC_FOUND_ROWS précède la requête limitante et l'appel FOUND_ROWS() récupère le nombre total.
Exemple :
SELECT SQL_CALC_FOUND_ROWS * FROM `table` WHERE `some_condition`; SELECT FOUND_ROWS();
Remarque : Cette méthode présente un inconvénient potentiel. MySQL a un bug qui affecte les requêtes ORDER BY lors de l'utilisation de cette technique, ce qui la rend plus lente sur les grandes tables.
Mise en cache du nombre
Une solution alternative consiste à mettre en cache le nombre total pour une durée déterminée. Cette approche élimine le besoin d'une requête distincte pour récupérer le décompte tout en préservant l'efficacité.
Exemple :
Récupérez le décompte et mettez-le en cache pendant 10 minutes :
SET @count = (SELECT COUNT(*) FROM `table` WHERE `some_condition`);
Dans les requêtes suivantes, utilisez le nombre mis en cache :
SELECT * FROM `table` WHERE `some_condition` LIMIT 0, 10;
Mise en cache du nombre de manière significative améliore les performances, en particulier pour les pages fréquemment visitées. Bien qu'il ne s'agisse pas d'une solution à requête unique, elle obtient le même résultat tout en étant plus efficace qu'une double requête.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!