«Limite 1000,25» vs «limite 25 Offset 1000»


11

Récemment, j'ai découvert que MySQL a une offsetfonctionnalité. J'ai essayé de trouver de la documentation sur les résultats de l'offset, ou la différence entre l'offset et la variante de limite, mais je n'arrive pas à trouver ce que je cherche.

Disons que j'ai 10 000 lignes dans une table et que je veux 25 résultats, à partir de la ligne 1 000. Pour autant que je suis arrivé jusqu'ici, je pouvais faire les deux pour obtenir le même résultat:

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

Ce que j'aimerais savoir, c'est la différence entre les deux.

  • Est-ce que cela fait la même chose ou est-ce que ma compréhension est fausse?
  • Est un plus lent / plus rapide dans les grandes tables
  • Le résultat du décalage change-t-il quand je le fais WHERE column=1(disons que la colonne a> 100 valeurs différentes)
  • Le résultat du décalage change-t-il quand je le fais ORDER BY column ASC(en supposant qu'il a des valeurs aléatoires)

S'il s'agit d'une question «stupide» et que quelqu'un connaît des documents éclairant le sujet, veuillez les ajouter dans les réponses.
J'ai l'impression que l'offset saute les premières lignes X trouvées dans la base de données, sans tenir compte du tri et de l'endroit.


La documentation MySQL l'explique parfaitement. Y a-t-il une raison pour laquelle vous n'êtes pas intéressé à le regarder vous-même?
siride

1
"Pour la compatibilité avec PostgreSQL, MySQL prend également en charge la syntaxe de décalage LIMIT row_count OFFSET." (depuis dev.mysql.com/doc/refman/5.5/en/select.html ).
siride

Parce que cela ne répond toujours pas à mes questions. D'après votre citation (et leur texte sur la page), je devrais conclure que l'offset est la même chose que la limite, seulement écrit différemment, comme si la LIMITE est le sélecteur de raccourci?
Martijn

1
c'est une syntaxe différente pour exprimer la même chose. Vos autres sous-questions sont complètement différentes du titre et de la première partie de votre message.
siride

1
Je comprends que si c'est la même chose, les autres requêtes ne seront pas effectuées différemment dans les deux situations. Je n'étais tout simplement pas convaincu que c'était la même chose, c'était la réponse que je cherchais, merci.
Martijn

Réponses:


9

En termes de fonctionnement

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

il n'y a absolument aucune différence dans les déclarations

Le commentaire de @ siride est exactement le point.

LIMIT 1000,25 veux dire LIMIT 25 OFFSET 1000

De la même documentation

LIMIT row_count est équivalent à LIMIT 0, row_count

VOS QUESTIONS RÉELLES

  • Est-ce que cela fait la même chose ou est-ce que ma compréhension est fausse?
  • Est un plus lent / plus rapide dans les grandes tables

Étant donné que les deux requêtes sont identiques, il n'y a aucune différence

  • Le résultat du décalage change-t-il quand je fais O do colonne = 1 (disons que la colonne a> 100 valeurs différentes)
  • Le résultat du décalage change-t-il lorsque je fais la commande ORDER BY dans la colonne ASC (en supposant qu'il a des valeurs aléatoires)

L'utilisation LIMITne modifie aucun jeu de résultats. Ils naviguent simplement dans l'ensemble de résultats.

Cette requête

SELECT id,name,description FROM tablename ORDER BY id LIMIT 1000,25

serait différent de

SELECT * FROM (SELECT id,name,description FROM tablename LIMIT 1000,25) A ORDER BY id;

parce que la LIMITE est appliquée à un stade différent.

La première requête ne renvoie rien si le nom de la table contient moins de 1 000 lignes

La deuxième requête ne renvoie rien si la sous-requête comporte moins de 1 000 lignes

CONCLUSION

Vous devrez sculpter la requête pour vous assurer que vous triez les données au bon stade


1
Je vous remercie. Ceci: "Il n'y a absolument aucune différence dans les déclarations" était exactement ce que je cherchais, et avec ce peu d'informations, je peux voir ce tri ou où cela n'a pas d'importance. Je n'étais pas sûr de savoir si c'était la même chose, et dans le codage, le diable est dans les détails, j'aimerais savoir avec certitude :)
Martijn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.