Quel est le moyen le plus efficace pour paginer mon site lors de l'interrogation avec SQL?

StackOverflow https://stackoverflow.com/questions/52723

  •  09-06-2019
  •  | 
  •  

Question

Je suis en train de paginer les résultats d'une requête SQL pour utiliser sur une page web.La langue et la principale base de données sont PHP et SQLite.

Le code que j'utilise fonctionne quelque chose comme ceci (page numérotation commence à 0)

http://example.com/table?page=0

page = request(page)
per = 10 // results per page
offset = page * per

// take one extra record so we know if a next link is needed
resultset = query(select columns from table where conditions limit offset, per + 1)

if(page > 0) show a previous link
if(count(resultset) > per) show a next link

unset(resultset[per])

display results

Existe-il des moyens plus efficaces de faire de la pagination que cela?

Un problème que je peux voir avec ma méthode, c'est que je dois stocker toutes les 10 (ou le nombre) de résultats dans la mémoire avant de commencer à afficher.Je le fais parce que PDO ne garantit pas que le nombre de lignes sera disponible.

Est-il plus efficace de délivrer un COUNT(*) requête pour savoir combien de lignes existent, ensuite diffuser les résultats pour le navigateur?

Est-ce l'un de ces "cela dépend de la taille de votre table, et si le count(*) requête nécessite une analyse de la table dans la base de données principale", "faire certaines de profilage de vous-même" genre de questions?

Était-ce utile?

La solution

je vous suggère de simplement faire le décompte de la première.un count(clé primaire) est très efficace requête.

Autres conseils

J'ai choisi d'aller avec le COUNT(*) deux méthode de requête, car il me permet de créer un lien directement à la dernière page, que l'autre méthode ne permet pas.En réalisant le comptage d'abord me permet aussi de diffuser les résultats, et donc devrait bien fonctionner avec un plus grand nombre de dossiers avec moins de mémoire.

La cohérence entre les pages n'est pas un problème pour moi.Je vous remercie pour votre aide.

Il ya plusieurs cas où j'ai une assez complexe (9-12 jointure de table) de requête, de retour de plusieurs milliers de lignes, dont j'ai besoin pour paginer.Évidemment, pour paginer bien, vous avez besoin de connaître la taille totale du résultat.Avec les bases de données MySQL, en utilisant le SQL_CALC_FOUND_ROWS directive dans le SELECT peut vous aider à atteindre facilement, bien que le jury est sur que ce sera plus efficace pour vous de faire.

Cependant, puisque vous utilisez SQLite, je recommande de s'en tenir à l'2 requête approche. Ici est très concis thread sur le sujet.

Je doute que ce sera un problème pour les utilisateurs à attendre pour le backend de retour de dix lignes.(Vous pouvez le faire jusqu'à eux en étant bon à spécifier les dimensions de l'image, faire de du serveur web de négocier comprimé transferts de données lorsque cela est possible, etc.)

Je ne pense pas qu'il sera très utile pour vous de faire un count(*) dans un premier temps.

Si vous êtes à certains compliqué de codage:Lorsque l'utilisateur est à la recherche à la page x, utiliser ajax-comme de la magie de pré-chargement de page (x+1) pour une expérience utilisateur améliorée.

Une remarque générale sur la pagination:Si les modifications de données pendant que l'utilisateur navigue sur vos pages, il peut être un problème si votre solution exige un très haut niveau de cohérence.J'ai writte une note à ce sujet d'ailleurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top