我有一个这样的查询:

SELECT article FROM table1 ORDER BY publish_date LIMIT 20

ORDER BY是如何工作的?它将排序所有记录,然后获得前20条,还是将获得20条记录并根据publish_date字段对它们进行排序?

如果是最后一篇,你不能保证真的得到最近的20篇文章。


当前回答

如果有一个合适的索引,在这个例子中是publish_date字段,那么MySQL不需要扫描整个索引来获得请求的20条记录——这20条记录将在索引的开始处找到。但如果没有合适的索引,则需要对表进行完整扫描。

2009年有一篇关于MySQL性能的博客文章。

其他回答

LIMIT子句可用于限制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。

所有详细信息:http://dev.mysql.com/doc/refman/5.0/en/select.html

您可以使用此代码 SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10 0是记录的开始限制和10记录的数量

可以简化为:

SELECT article FROM table1 ORDER BY publish_date

你也可以在ORDER BY中添加许多参数,这些参数是用逗号分隔的,比如:ORDER BY publish_date, tab2, tab3 DESC等等…

如果有一个合适的索引,在这个例子中是publish_date字段,那么MySQL不需要扫描整个索引来获得请求的20条记录——这20条记录将在索引的开始处找到。但如果没有合适的索引,则需要对表进行完整扫描。

2009年有一篇关于MySQL性能的博客文章。

它会先点餐,然后再拿到前20份。数据库还将处理ORDER BY之前的WHERE子句中的任何内容。