我的iPhone应用程序连接到我的PHP Web服务以从MySQL数据库检索数据。请求可以返回500个结果。
一次实现分页和检索20个项目的最佳方法是什么?
假设我收到了数据库中的前20个广告。现在我该如何申请接下来的20个广告?
答案 0 :(得分:264)
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。
答案 1 :(得分:101)
对于500条记录,效率可能不是问题,但如果你有数百万条记录,那么使用WHERE子句选择下一页是有利的:
SELECT *
FROM yourtable
WHERE id > 234374
ORDER BY id
LIMIT 20
此处的“234374”是您查看的热门信息页中最后一条记录的ID。
这将启用id的索引来查找第一条记录。如果您使用LIMIT offset, 20
,您可能会发现当您向末尾寻呼时,它会变得越来越慢。正如我所说,如果你只有200条记录可能无关紧要,但它可以对更大的结果集产生影响。
这种方法的另一个优点是,如果数据在调用之间发生变化,您将不会错过记录或获得重复记录。这是因为添加或删除行意味着更改后所有行的偏移量。在你的情况下,它可能并不重要 - 我猜你的广告池不会经常变化,无论如何没有人会注意到他们连续两次获得相同的广告 - 但如果你正在寻找“最好的方式”那么在选择使用哪种方法时要记住这一点。
如果您确实希望将LIMIT与偏移量一起使用(如果用户直接导航到页面10000而不是逐页翻页,则必须这样做),那么您可以阅读有关late row lookups的文章以提高性能LIMIT的偏移量很大。
答案 2 :(得分:20)
为查询定义 OFFSET 。例如
第1页 - (记录01-10):偏移= 0,极限= 10;
第2页 - (记录11-20)偏移= 10,极限= 10;
并使用以下查询:
SELECT column FROM table LIMIT {someLimit} OFFSET {someOffset};
第2页的示例:
SELECT column FROM table
LIMIT 10 OFFSET 10;
答案 3 :(得分:19)
有关于它的文献:
Optimized Pagination using MySQL,计算行总数和分页之间的区别。
Efficient Pagination Using MySQL,由雅虎公司参加Percona Performance Conference 2009.Percona MySQL团队也将其作为Youtube视频提供:Efficient Pagination Using MySQL (video),
使用大OFFSET
时会出现主要问题。他们避免使用OFFSET
使用各种技术,范围从id
子句中的WHERE
范围选择到某种缓存或预计算页面。
建议的解决方案使用INDEX,Luke :
" Paging Through Results"
" Pagination done the right way"
答案 4 :(得分:11)
本教程展示了一种很好的分页方式。 Efficient Pagination Using MySQL
简而言之,避免使用OFFSET或大LIMIT
答案 5 :(得分:5)
你也可以
SELECT SQL_CALC_FOUND_ROWS * FROM tbl limit 0, 20
select语句的行计数(没有限制)在同一个select语句中捕获,因此您不需要再次查询表大小。 您可以使用SELECT FOUND_ROWS();
获取行计数答案 6 :(得分:4)
查询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毫秒