282 votes

MySql Data - Le meilleur moyen d'implémenter la pagination?

Mon application iphone se connecte à mon service Web php pour récupérer des données de la base de données MySql? une demande peut retourner 500 résultats; Alors, quel est le meilleur moyen de mettre en œuvre la pagination et de récupérer 20 éléments de données à la fois?

  • Disons que je reçois les 20 premières annonces de ma base de données. Maintenant, comment puis-je demander les 20 prochaines annonces dans ma base de données?

415voto

Faisal Feroz Points 4926

À partir de la documentation de MySQL:

La clause LIMIT peuvent être utilisés pour limiter le nombre de lignes retournées par l'instruction SELECT. LIMIT a un ou deux arguments numériques, qui doivent tous deux être entier non négatif constantes (sauf lors de l'utilisation des requêtes préparées).

Avec deux arguments, le premier argument spécifie le décalage de la première ligne pour le retour, et le second indique le nombre maximal de lignes à retourner. Le décalage de la première ligne est 0 (pas de 1):

SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15

Pour récupérer toutes les lignes à partir d'un certain décalage jusqu'à la fin de l'ensemble de résultats, vous pouvez utiliser un grand nombre pour le deuxième paramètre. Cette instruction permet d'extraire toutes les lignes de la 96e de ligne à la dernière:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

Avec un argument, la valeur spécifie le nombre de lignes à retourner dès le début du jeu de résultats:

SELECT * FROM tbl LIMIT 5;     # Retrieve first 5 rows

En d'autres termes, la LIMITE de row_count est équivalente à la LIMITE de 0, row_count.

167voto

Mark Byers Points 318575

Pour 500 dossiers de l'efficacité est probablement pas un problème, mais si vous avez des millions de dossiers alors il peut être avantageux d'utiliser une clause where pour sélectionner la page suivante:

SELECT *
FROM yourtable
WHERE id > 234374
ORDER BY id
LIMIT 20

Le "234374" ici est l'id du dernier enregistrement de l'précédents page affichée.

Cela permettra à un indice sur l'id pour être utilisé pour rechercher le premier enregistrement. Si vous utilisez LIMIT offset, 20 vous pourriez trouver qu'il devient plus lent et plus lent que vous page vers la fin. Comme je l'ai dit, il ne sera probablement pas d'importance si vous avez seulement 200 enregistrements, mais il peut faire une différence avec les plus grands ensembles de résultats.

Un autre avantage de cette approche est que si les modifications de données entre les appels que vous ne manquerez pas de dossiers ou d'obtenir un enregistrement répété. C'est en raison de l'ajout ou de la suppression d'une ligne signifie que le décalage de toutes les lignes après il change. Dans votre cas, c'est probablement pas important - je suppose que vos annonces ne change pas trop souvent et de toute façon, ne serait pas d'avis, si ils ont la même annonce deux fois de suite, mais si vous êtes à la recherche de la "meilleure façon", alors c'est une autre chose à garder à l'esprit lors du choix de l'approche à utiliser.

Si vous ne souhaitez LIMITE d'utilisation avec un décalage (et c'est nécessaire si un utilisateur accède directement à la page de 10000 au lieu de le feuilleter les pages une par une) puis vous pouvez lire cet article sur la fin de la ligne des recherches pour améliorer les performances de la LIMITE avec un grand décalage.

13voto

Bao Le Points 1468

Ce tutoriel montre un excellent moyen de faire de la pagination. Pagination efficace avec MySQL

En bref, évitez d’utiliser OFFSET ou une grande LIMIT

10voto

surajz Points 1347

tu peux aussi faire

 SELECT SQL_CALC_FOUND_ROWS * FROM tbl limit 0, 20
 

Le nombre de lignes de l'instruction select (sans limite) est capturé dans la même instruction select, de sorte que vous n'avez pas besoin d'interroger à nouveau la taille de la table. Vous obtenez le nombre de lignes en utilisant SELECT FOUND_ROWS ();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X