MySQL数据 - 实现分页的最佳方式?

时间:2010-09-26 18:20:37

标签: mysql

我的iPhone应用程序连接到我的PHP Web服务以从MySQL数据库检索数据。请求可以返回500个结果。

一次实现分页和检索20个项目的最佳方法是什么?

假设我收到了数据库中的前20个广告。现在我该如何申请接下来的20个广告?

7 个答案:

答案 0 :(得分:264)

From the MySQL documentation

  

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)

有关于它的文献:

使用大OFFSET时会出现主要问题。他们避免使用OFFSET使用各种技术,范围从id子句中的WHERE范围选择到某种缓存或预计算页面。

建议的解决方案使用INDEX,Luke

答案 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毫秒