如何使用PHP和MySQL有效地对大型数据集进行分页?

Eve*_*oob 7 php mysql logic pagination

正如你们中的一些人所知,在MySQL中使用LIMIT关键字并不妨碍它阅读前面的记录.

例如:

SELECT * FROM my_table LIMIT 10000, 20;
Run Code Online (Sandbox Code Playgroud)

意味着MySQL仍将读取前10,000条记录,并在生成我们追踪的20条记录之前抛弃它们.

因此,在对大型数据集进行分页时,高页码意味着加载时间过长.

有没有人知道任何现有的分页类/技术/方法可以以更有效的方式对大型数据集进行分页,即不依赖于LIMIT MySQL关键字?

在PHP中,如果可能的话,因为这是我公司的首选武器.

干杯.

Jos*_*vis 7

首先,如果你想分页,你绝对必须有一个ORDER BY子句.然后,您只需使用该子句深入挖掘数据集.例如,考虑一下:

SELECT * FROM my_table ORDER BY id LIMIT 20
Run Code Online (Sandbox Code Playgroud)

您将拥有前20条记录,假设它们的ID是:5,8,9,...,53,54.您到第2页的分页链接看起来像"list.php?page = 2&id = 64",您的查询将是

SELECT * FROM my_table WHERE id > 64 ORDER BY id LIMIT 20
Run Code Online (Sandbox Code Playgroud)

没有偏移,只读了20条记录.它不允许您随意跳转到任何页面,但大多数时候人们只是浏览下一个/上一页.即使使用大的OFFSET值,"id"的索引也会改善性能.

  • 该方法与删除行无关,它不假设id是连续的,如示例所示.如果您在URL中传递页码,则不会丢失页码. (3认同)

Pas*_*TIN 1

解决方案可能是不使用 limit 子句,而是使用联接——联接用作某种序列的表。

有关更多信息,在 SO 上,我找到了这个问题/答案,其中给出了一个示例 - 可能对您有帮助;-)