Answers:
LIMIT子句可用于约束SELECT语句返回的行数。LIMIT接受一个或两个数字参数,这两个参数都必须是非负整数常量(使用预处理语句时除外)。
有两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。初始行的偏移量是0(不是1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
要检索从某个偏移量到结果集结尾的所有行,可以为第二个参数使用较大的数字。该语句检索从第96行到最后一行的所有行:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
使用一个参数,该值指定从结果集的开头返回的行数:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
换句话说,LIMIT row_count等效于LIMIT 0 row_count。
limit X, Y
,本质上会发生的是检索X + Y行,然后删除从开头开始的X行,并返回剩下的所有内容。重申:limit X, Y
导致扫描X + Y行。
OFFSET
;-)
对于500条记录,效率可能不是问题,但是如果您有数百万条记录,那么使用WHERE子句选择下一页可能是有利的:
SELECT *
FROM yourtable
WHERE id > 234374
ORDER BY id
LIMIT 20
这里的“ 234374”是您上次查看的页面中最后一条记录的ID。
这将使id上的索引可用于查找第一条记录。如果您使用它,LIMIT offset, 20
您会发现随着向最后翻页,它变得越来越慢。就像我说的,只有200条记录可能并不重要,但是对于较大的结果集却可以有所作为。
这种方法的另一个优点是,如果两次调用之间的数据发生变化,您将不会错过任何记录或获得重复的记录。这是因为添加或删除行意味着更改后所有行的偏移量。对于您而言,这可能并不重要-我猜您的广告库不会经常更改,而且无论如何,没人会注意到他们是否连续两次获得相同的广告-但是,如果您正在寻找“最佳方式”那么选择使用哪种方法时,还要记住另一件事。
如果您确实希望使用带偏移量的LIMIT(如果用户直接导航到第10000页而不是一页一页地浏览,则必须这样做),那么您可以阅读这篇有关后期行查找的文章,以提高LIMIT的性能。抵消。
limit 1000000, 10
事情,并且编写并希望它能起作用将不会带您到任何地方。
area=width*height
不仅仅是重要的记录数量,而且每条记录的大小也是将结果存储到内存中的一个因素
有关于它的文献:
使用MySQL优化了分页,使计数总行数和分页之间有所不同。
Yahoo Inc.在Percona Performance Conference 2009上使用MySQL进行有效分页。Percona MySQL团队也将其作为Youtube视频提供:使用MySQL进行有效分页(视频),
主要问题发生在使用大OFFSET
s时。他们避免使用OFFSET
带有各种技术,从id
范围选择在WHERE
子句中的到某种缓存或预计算页面。
在Use INDEX,Luke中有建议的解决方案:
你也可以
SELECT SQL_CALC_FOUND_ROWS * FROM tbl limit 0, 20
select语句的行计数(没有限制)在同一条select语句中捕获,因此您无需再次查询表大小。您可以使用SELECT FOUND_ROWS()获得行数;
*
在更多的列比需要被提取,结果SQL_CALC_FOUND_ROWS
这些列结果被读取的所有表中的行,即使它们不包含在结果中。在不读取所有这些列的单独查询中计算行数会更加有效。然后,您的主查询可以在读取20行后停止。
查询1: SELECT * FROM yourtable WHERE id > 0 ORDER BY id LIMIT 500
查询2: SELECT * FROM tbl LIMIT 0,500;
查询1的记录较小或中等时运行速度更快,如果记录数等于5,000或更高,则结果类似。
500条记录的结果:
Query1花费9.9999904632568毫秒
Query2花费19.999980926514毫秒
8,000条记录的结果:
Query1需要129.99987602234毫秒
Query2需要160.00008583069毫秒
id
。
id > 0
什么用?
offset
(limit的第一个参数是offset),您仍在选择所有数据到limit,然后丢弃该数量的offset,然后返回介于offset
和之间的部分limit
。where
另一方面,with 子句将为查询设置一种起点,并查询ONLY
该特定部分。
从单个表中获取数据时,分页很简单,但是从多个表中检索数据时,分页则很复杂。这是MySql和Spring的一个很好的示例:https :
//www.easycodeforall.com/zpagination1.jsp