La clause LIMIT peut être utilisée pour limiter le nombre de lignes renvoyées par l'instruction SELECT. LIMIT prend un ou deux arguments numériques, qui doivent tous deux être des constantes entières non négatives (sauf lors de l'utilisation d'instructions préparées).
Avec deux arguments, le premier argument spécifie le décalage de la première ligne à renvoyer et le second spécifie le nombre maximum de lignes à renvoyer. Le décalage de la ligne initiale est 0 (pas 1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Pour récupérer toutes les lignes 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 récupère toutes les lignes de la 96e ligne à la dernière:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
Avec un argument, la valeur spécifie le nombre de lignes à renvoyer depuis le début du jeu de résultats:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
En d'autres termes, LIMIT row_count est équivalent à LIMIT 0, row_count.
limit X, Y
, ce qui se passe essentiellement est que les lignes X + Y sont récupérées, puis X lignes depuis le début sont supprimées et tout ce qui reste est retourné. Pour réitérer:limit X, Y
résulte en un balayage des lignes X + Y.OFFSET
;-)Pour 500 enregistrements, l'efficacité n'est probablement pas un problème, mais si vous avez des millions d'enregistrements, il peut être avantageux d'utiliser une clause WHERE pour sélectionner la page suivante:
Le "234374" est ici l'identifiant du dernier enregistrement de la page précédente que vous avez consultée.
Cela permettra à un index sur id d'être utilisé pour trouver le premier enregistrement. Si vous l'utilisez,
LIMIT offset, 20
vous constaterez que cela devient de plus en plus lent lorsque vous naviguez vers la fin. Comme je l'ai dit, cela n'aura probablement pas d'importance si vous n'avez que 200 enregistrements, mais cela peut faire la différence avec des ensembles de résultats plus importants.Un autre avantage de cette approche est que si les données changent entre les appels, vous ne manquerez pas d'enregistrements ou n'obtiendrez pas un enregistrement répété. En effet, l'ajout ou la suppression d'une ligne signifie que le décalage de toutes les lignes après sa modification. Dans votre cas, ce n'est probablement pas important - je suppose que votre pool d'annonces ne change pas trop souvent et de toute façon personne ne remarquerait s'il reçoit la même annonce deux fois de suite - mais si vous cherchez la "meilleure façon" alors c'est une autre chose à garder à l'esprit lors du choix de l'approche à utiliser.
Si vous souhaitez utiliser LIMIT avec un décalage (et cela est nécessaire si un utilisateur accède directement à la page 10000 au lieu de parcourir les pages une par une), vous pouvez lire cet article sur les recherches de ligne tardives pour améliorer les performances de LIMIT avec un grand décalage.
la source
limit 1000000, 10
et espérer que cela fonctionnera ne vous mènera nulle part.area=width*height
ce n'est donc pas seulement la quantité d'enregistrements qui peut avoir de l'importance, mais la taille de chaque enregistrement est également un facteur lors du stockage des résultats en mémoireDéfinissez OFFSET pour la requête. Par exemple
page 1 - (enregistrements 01-10): décalage = 0, limite = 10;
page 2 - (enregistrements 11-20) offset = 10, limit = 10;
et utilisez la requête suivante:
exemple pour la page 2:
la source
Il y a de la littérature à ce sujet:
Pagination optimisée à l'aide de MySQL , faisant la différence entre le comptage du nombre total de lignes et la pagination.
Pagination efficace à l'aide de MySQL , par Yahoo Inc. dans la Percona Performance Conference 2009. L'équipe Percona MySQL le propose également sous forme de vidéo Youtube: Pagination efficace à l'aide de MySQL (vidéo) ,
Le problème principal se produit avec l'utilisation de grands
OFFSET
s. Ils évitent d'utiliserOFFSET
avec une variété de techniques, allant desid
sélections de plage dans laWHERE
clause, à une sorte de pages de mise en cache ou de pré-calcul.Il y a des solutions suggérées à Use the INDEX, Luke :
" Recherche de résultats ".
" La pagination s'est bien déroulée ".
la source
Ce tutoriel montre une excellente façon de faire de la pagination. Pagination efficace avec MySQL
En bref, évitez d'utiliser OFFSET ou large LIMIT
la source
tu peux aussi faire
Le nombre de lignes de l'instruction select (sans limite) est capturé dans la même instruction select afin que vous n'ayez pas à interroger à nouveau la taille de la table. Vous obtenez le nombre de lignes en utilisant SELECT FOUND_ROWS ();
la source
*
résultats dans plus de colonnes que nécessaire sont récupérés et lesSQL_CALC_FOUND_ROWS
résultats dans ces colonnes sont lus à partir de toutes les lignes du tableau, même s'ils ne sont pas inclus dans le résultat. Il serait beaucoup plus efficace de calculer le nombre de lignes dans une requête distincte qui ne lit pas toutes ces colonnes. Ensuite, votre requête principale peut s'arrêter après avoir lu 20 lignes.Requête 1:
SELECT * FROM yourtable WHERE id > 0 ORDER BY id LIMIT 500
Requête 2:
SELECT * FROM tbl LIMIT 0,500;
La requête 1 s'exécute plus rapidement avec des enregistrements petits ou moyens, si le nombre d'enregistrements est égal ou supérieur à 5 000, le résultat est similaire.
Résultat pour 500 enregistrements:
La requête 1 prend 9,9999904632568 millisecondes
La requête 2 prend 19,999980926514 millisecondes
Résultat pour 8 000 enregistrements:
La requête 1 prend 129,99987602234 millisecondes
Requête2: 160,00008583069 millisecondes
la source
id
.id > 0
utile?offset
(le premier argument à limiter est décalé), vous sélectionnez toujours toutes les données à la limite, puis vous supprimez cette quantité de décalage, puis vous retournez la section qui se situe entreoffset
etlimit
. avec lawhere
clause d'autre part, vous définissez une sorte de point de départ pour la requête et interrogezONLY
cette partie spécifique.La pagination est simple lorsqu'elle récupère des données à partir d'une seule table, mais elle est complexe lorsqu'elle récupère des données joignant plusieurs tables. Voici un bon exemple avec MySql et Spring:
https://www.easycodeforall.com/zpagination1.jsp
la source