我有一个查询看起来像这样:
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
ORDER BY
是如何工作的?它会对所有记录进行排序,然后获取前20个记录,还是会获取20条记录并按publish_date
字段对它们进行排序?
如果是后者,您无法保证确实获得最近的20篇文章。
我有一个查询看起来像这样:
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
ORDER BY
是如何工作的?它会对所有记录进行排序,然后获取前20个记录,还是会获取20条记录并按publish_date
字段对它们进行排序?
如果是后者,您无法保证确实获得最近的20篇文章。
先进行排序,然后获取前20个。在ORDER BY
之前,数据库还将处理WHERE
子句中的任何内容。
LIMIT
破坏了ORDER BY
的顺序。使用LIMIT
时,ORDER BY
返回错误的结果。LIMIT
会以某种方式重新排列ORDER BY
返回的结果集。 - GreenLIMIT子句可用于限制SELECT语句返回的行数。LIMIT接受一个或两个数字参数,这两个参数必须都是非负整数常量(除了使用预处理语句时)。
有两个参数时,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行的偏移量为0(而不是1):
SELECT * FROM tbl LIMIT 5,10; # 检索行6-15
要检索从某个偏移量到结果集结尾的所有行,可以为第二个参数使用一些大数。此语句检索从第96行到最后一行的所有行:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
只有一个参数时,该值指定要从结果集开头返回的行数:
SELECT * FROM tbl LIMIT 5; # 检索前5行
换句话说,LIMIT row_count相当于LIMIT 0,row_count。
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;
当我手动编写查询来检查数据库中的各种内容时,我使用这种技术。虽然我没有在生产环境中使用过它,但现在当我对其进行了基准测试时,额外的排序并不会影响性能。
ORDER BY stamp DESC
在ORDER BY
之后添加LIMIT
子句。
publish_date
字段上,则 MySQL 不需要扫描整个索引以获取所请求的 20 条记录 - 这 20 条记录将在索引开头找到。但如果没有适当的索引,则需要对整个表进行全面扫描。SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
其中0是记录的起始限制,10是记录的数量。LIMIT 10
是 LIMIT 0,10
的简写。 - Lawrence DolLIMIT通常是作为最后一个操作执行的,所以结果会先被排序,然后限制在20个之内。实际上,一旦找到了前20个已排序的结果,排序就会停止。
可以简化为:
SELECT article FROM table1 ORDER BY publish_date DESC FETCH FIRST 20 ROWS ONLY;
您还可以在ORDER BY
中添加许多参数,只需用逗号分隔,例如:ORDER BY publish_date、 tab2、tab3 DESC
等等...