web-dev-qa-db-fra.com

Comment MySQL traite-t-il ORDER BY et LIMIT dans une requête?

J'ai une requête qui ressemble à ceci:

SELECT article FROM table1 ORDER BY publish_date LIMIT 20

Comment fonctionne ORDER BY? Ordonnera-t-il tous les enregistrements, puis les 20 premiers? Ou obtiendra-t-il 20 enregistrements et les classera-t-il dans le champ publish_date?

Si c'est le dernier, vous n'êtes pas sûr d'obtenir vraiment les 20 articles les plus récents.

225
Alex

Il ordonnera d'abord, puis obtiendra le premier 20. Une base de données traitera également tout ce qui se trouve dans la clause WHERE avant le ORDER BY.

226
James

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 lorsque vous utilisez des 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 maximal 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 du jeu de résultats, vous pouvez utiliser un nombre élevé pour le deuxième paramètre. Cette instruction récupère toutes les lignes de la 96ème à 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.

Tous les détails sur: http://dev.mysql.com/doc/refman/5.0/en/select.html

37
bensiu

Vous pouvez ajouter [asc] ou [desc] à la fin de la commande en obtenant les enregistrements les plus anciens ou les plus récents.

Par exemple, cela vous donnera d'abord les derniers enregistrements

ORDER BY stamp DESC

Ajouter la clause LIMIT après ORDER BY

8
Paul

Comme @James le dit, il ordonnera tous les enregistrements, puis obtiendra les 20 premières lignes.

Dans l’état actuel des choses, vous êtes assuré d’obtenir les 20 premiers articles publiés, les plus récents ne seront pas affichés.

Dans votre cas, je vous recommande d’ajouter desc à order by publish_date, si vous voulez les articles les plus récents, l’article le plus récent sera le premier.

Si vous devez conserver le résultat dans l'ordre croissant et ne souhaitez toujours que les 10 articles les plus récents, vous pouvez demander à mysql de trier votre résultat deux fois.

Cette requête ci-dessous va trier le résultat par ordre décroissant et limiter le résultat à 10 (c'est-à-dire la requête entre parenthèses). Il sera toujours trié par ordre décroissant, et nous ne sommes pas satisfaits, alors nous demandons à mysql de le trier une fois de plus. Nous avons maintenant le dernier résultat sur la dernière ligne.

select t.article 
from 
    (select article, publish_date 
     from table1
     order by publish_date desc limit 10) t 

order by t.publish_date asc;

Si vous avez besoin de toutes les colonnes, procédez comme suit:

select t.* 
from 
    (select * 
     from table1  
     order by publish_date desc limit 10) t 

order by t.publish_date asc;

J'utilise cette technique lorsque j'écris manuellement des requêtes pour examiner différentes bases de données. Je ne l'ai pas utilisé dans un environnement de production, mais maintenant, lorsque je le marque, le tri supplémentaire n'a aucune incidence sur les performances.

7

S'il existe un index approprié, dans le cas présent sur le champ publish_date, alors MySQL n'a pas besoin d'analyser l'intégralité de l'index pour obtenir les 20 enregistrements demandés - les 20 enregistrements seront trouvés au début de l'index. Mais s'il n'y a pas d'index approprié, une analyse complète de la table sera nécessaire.

Il existe un article sur le blog Performance de MySQL de 2009 à ce sujet.

7
martin clayton

Vous pouvez utiliser ce code SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10 où 0 est la limite de début de l’enregistrement et 10 le nombre d’enregistrements.

5
gaurangkathiriya

LIMIT est généralement appliqué lors de la dernière opération. Le résultat est donc d'abord trié, puis limité à 20. En fait, le tri s'arrête dès que les 20 premiers résultats triés sont trouvés.

2
Egor Pavlikhin