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

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

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

假设我从数据库中接收了前20个条目,我现在如何请求接下来的20个条目?

330811 次浏览

来自MySQL文档:

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。

你也可以

SELECT SQL_CALC_FOUND_ROWS * FROM tbl limit 0, 20

select语句的行数(没有限制)在同一个select语句中捕获,因此您不需要再次查询表大小。 使用SELECT FOUND_ROWS();

获得行数

对于500条记录,效率可能不是问题,但如果你有数百万条记录,那么使用WHERE子句来选择下一页可能会更有利:

SELECT *
FROM yourtable
WHERE id > 234374
ORDER BY id
LIMIT 20

这里的“234374”是您查看的上一页中最后一条记录的id。

这将使id上的索引能够用于查找第一条记录。如果你使用LIMIT offset, 20,你会发现随着页面的结束,它会变得越来越慢。正如我所说的,如果只有200条记录,这可能无关紧要,但如果结果集更大,情况就不同了。

这种方法的另一个优点是,如果调用之间的数据发生变化,您不会错过记录或得到重复的记录。这是因为添加或删除一行意味着它之后所有行的偏移量都会发生变化。在你的情况下,这可能并不重要——我猜你的广告池不会经常变化,而且无论如何,如果他们连续两次看到相同的广告,没有人会注意到——但如果你正在寻找“最佳方式”,那么在选择使用哪种方法时,这是另一件需要记住的事情。

如果你确实希望使用带有偏移量的LIMIT(如果用户直接导航到第10000页,而不是逐个页面分页,这是必要的),那么你可以阅读这篇关于晚行查找的文章,以提高带有大偏移量的LIMIT的性能。

本教程展示了一个进行分页的好方法。 使用MySQL进行高效分页 < / p >

简而言之,避免使用OFFSET或较大的LIMIT

查询1:SELECT * FROM yourtable WHERE id > 0 ORDER BY id LIMIT 500

查询2:SELECT * FROM tbl LIMIT 0,500;

查询1对中小记录运行更快,如果记录数量等于5000或更高,结果相似。

500条记录的结果:

Query1需要9.9999904632568毫秒

Query2耗时19.999980926514毫秒

8,000条记录的结果:

Query1需要129.99987602234毫秒

Query2需要160.00008583069毫秒

有相关的文献:

主要问题发生在使用大的__abc0时。它们避免将OFFSET与各种技术一起使用,从WHERE子句中的id范围选择,到某种类型的缓存或预计算页面。

使用索引,卢克有一些建议的解决方案:

为查询定义抵消。例如

Page 1-(记录01-10):offset = 0, limit=10;

第2页-(记录11-20)offset =10, limit =10;

并使用以下查询:

SELECT column FROM table LIMIT {someLimit} OFFSET {someOffset};

第2页示例:

SELECT column FROM table
LIMIT 10 OFFSET 10;

如果您希望在存储过程中执行此操作,可以尝试此操作

SELECT * FROM tbl limit 0, 20.

不幸的是,使用公式不起作用,所以你可以执行一个准备好的语句,或者只是给过程的开始和结束值。