MySQL如何处理查询中的ORDER BY和LIMIT?
我有一个如下的查询:MySQL如何处理查询中的ORDER BY和LIMIT?,mysql,sql,sql-order-by,sql-limit,Mysql,Sql,Sql Order By,Sql Limit,我有一个如下的查询: 按发布日期限制从表1中选择文章20 如何按工作排序?它将对所有记录进行排序,然后获得前20条记录,还是将获得20条记录并按publish\u date字段进行排序 如果它是最后一个,你不能保证真的得到最近的20篇文章。它会先订购,然后得到前20篇。数据库还将处理WHERE子句中orderby之前的任何内容。LIMIT子句可用于约束SELECT语句返回的行数。LIMIT接受一个或两个数值参数,这两个参数都必须是非负整数常量(使用准备语句时除外) 对于两个参数,第一个参数指定要
按发布日期限制从表1中选择文章20
如何按工作排序?它将对所有记录进行排序,然后获得前20条记录,还是将获得20条记录并按publish\u date
字段进行排序
如果它是最后一个,你不能保证真的得到最近的20篇文章。它会先订购,然后得到前20篇。数据库还将处理
WHERE
子句中orderby
之前的任何内容。LIMIT子句可用于约束SELECT语句返回的行数。LIMIT接受一个或两个数值参数,这两个参数都必须是非负整数常量(使用准备语句时除外)
对于两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行的偏移量为0(不是1):
从tbl限制5,10中选择*检索第6-15行
要检索从某个偏移量到结果集末尾的所有行,可以对第二个参数使用一些较大的数字。此语句检索从第96行到最后一行的所有行:
从tbl限额9518446744073709551615中选择*代码>
通过一个参数,该值指定从结果集开始返回的行数:
从tbl限制5中选择*检索前5行
换句话说,限制行数等于限制0,行数
有关的所有详细信息:限制通常作为最后一个操作应用,因此将首先对结果进行排序,然后限制为20。事实上,只要找到前20个排序结果,排序就会停止。如果有合适的索引,在这种情况下,在publish\u date
字段上,MySQL不需要扫描整个索引以获得请求的20条记录-20条记录将在索引的开始处找到。但如果没有合适的索引,则需要对表进行完整扫描
有一个从2009年开始的记录。您可以在订单末尾添加[asc]或[desc],以获取最早或最新的记录
例如,这将首先为您提供最新的记录
ORDER BY stamp DESC
将LIMIT
子句附加在orderby
之后,您可以使用此代码
按发布日期限制0,10从表1中选择文章
其中0是记录的开始限制&10条记录的数量正如@James所说,它将对所有记录进行排序,然后获得前20行
既然如此,你保证会得到20篇第一次发表的文章,更新的文章将不会显示
在您的情况下,我建议您将desc
添加到orderbypublish\u date
,如果您想要最新的文章,那么最新的文章将排在第一位
如果您需要保持结果的升序,并且仍然只需要10篇最新文章,那么您可以让mysql对结果进行两次排序
下面的查询将按降序对结果进行排序,并将结果限制为10(即括号内的查询)。它仍将按降序排序,我们对此并不满意,因此我们要求mysql再次对其进行排序。现在我们有最后一行的最新结果
select t.article
from
(select article, publish_date
from table1
order by publish_date desc limit 10) t
order by t.publish_date asc;
如果需要所有列,请按以下方式完成:
select t.*
from
(select *
from table1
order by publish_date desc limit 10) t
order by t.publish_date asc;
当我手动编写查询以检查数据库中的各种内容时,我使用这种技术。我没有在生产环境中使用过它,但现在当我对它进行台架标记时,额外的排序不会影响性能。可以简化为:
按发布日期描述从表1中选择文章,仅获取前20行代码>
您还可以在按发布日期排序的中添加许多参数,如:按发布日期排序、tab2、tab3 DESC
等。欢迎使用stackoverflow。我想你可能误解了这个问题。我相信他们问的是操作顺序,而不是“如何排序”。(但这是没有意义的,因为这个问题刚才已经得到了回答。)你的第二句话与第一句相反。当找到前20个结果时,排序无法停止,因为正如您所说,排序将在返回结果之前完成。MySQL只能在排序完成后知道前20个结果是什么。@Tom,如果按索引列排序,实际上可以。这里有解释:不是检索第5-14行吗?@adonis不,不是。这个例子就在第6行的数字5的右边。忽略了5行(0到4)。但是使用没有顺序的LIMIT BY可能会产生不一致的结果!不幸的是,在应用限制之前,必须对整个结果集进行排序,或者DBMS可以随意对结果进行排序,然后对该集进行偏移和限制。我已经读到,这可能是由于DBMS根据偏移量和限制选择了一个备用查询计划,从而导致了任意顺序。问题是询问限制和顺序。但是答案与这个问题毫无关系不,这不是必须的<代码>限制10
是限制0,10
的简写。是的,限制0,10不需要,但您可以像此限制10,20一样要求。请注意,如果一些发布日期
相等,按它们排序不会给出确定的结果,这意味着如果您使用限制
进行分页,你可能会在不同的页面上得到相同的项目!额外的排序实际上不会对性能产生任何可测量的影响,因为它仅限于10行/项:-)。通常,对内存中的表(子选择正在生成)进行排序非常快,并且几乎无法测量,除非您有数百万行,或者DBMS正在将结果集分页到磁盘,因为它不适合内存(在这种情况下,根据DBMS,它也可以中止查询)。非常好的主意!TXBut。。。。使用连接是可能的