web-dev-qa-db-fra.com

"Limite 1000,25" vs "limite 25 Offset 1000"

Récemment, j'ai découvert que MySQL a une fonction offset. 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-ce un plus lent/plus rapide dans les grandes tables
  • Le résultat du décalage change-t-il lorsque je le fais WHERE column=1 (disons que la colonne a> 100 valeurs différentes)
  • Le résultat du décalage change-t-il lorsque 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 X premières lignes trouvées dans la base de données, sans tenir compte du tri et de l'endroit.

11
Martijn

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-ce un plus lent/plus rapide dans les grandes tables

Étant donné que les deux requêtes sont les mêmes, il n'y a pas de différence

  • Le résultat du décalage change-t-il quand je fais OERE 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 ASC (en supposant qu'il a des valeurs aléatoires)

L'utilisation de LIMIT ne 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

9
RolandoMySQLDBA