Paginate通过PHP与MySQL最佳实践?

时间:2015-11-05 18:24:47

标签: php mysql performance pagination

在处理至少100万行的记录时,就性能而言,最好是:

选择整个记录,例如SELECT * FROM tbl,然后使用array_chunk()array_slice()

对结果进行分页

仅选择记录的一部分,例如,每页SELECT * FROM tbl LIMIT x

5 个答案:

答案 0 :(得分:1)

我认为这取决于你可以使用memcache将整个响应存储在内存中,如果你的表不是太大而且它会避免更耗时的硬盘请求,但是你不知道你的用户是否会寻找很多对于页面,最好用SQL限制它。

答案 1 :(得分:1)

取决于。

  1. 此表中的数据是否经常更改?
  2. 是 - >你需要查询DB。

    1. 数据库大而且经常变化吗?
    2. 然后使用某种类型的搜索引擎,如Elasticsearch,不要查询数据库只是填充搜索引擎

      1. 数据库是否很小但查询需要很长时间?
      2. 使用某种缓存,如redis / memcache

        这实际上取决于您的需求。

答案 2 :(得分:1)

最好的方法取决于您的背景。如果您选择直接使用数据库,请注意此问题:

当您进入后续页面时,天真的LIMIT方法会给您带来问题。 ORDER BY some_key LIMIT offset,page_size的工作方式如下 - 通过键,通过第一个偏移记录,然后返回 page_size 记录。所以检查了 offset + page_size 记录,如果 offset 很高,则表示您遇到问题。

更好 - 记住当前页面的最后一个键值。提取下一页时请使用它:

SELECT * FROM tbl WHERE the_key > $last_key ORDER BY the_key ASC LIMIT $page_size

如果您的密钥不是唯一的,请在最后添加一个额外的唯一ID列,使其唯一。

答案 3 :(得分:1)

它真的取决于背景。

通常,您希望大量使用索引来从具有快速结果的大型数据集中选择所需的内容。通过编程语言分页比使用数据库更快。数据库往往是瓶颈。对于每分钟有100个查询的应用程序,我们必须这样做。对数据库的命中需要限制,因此我们需要返回我们知道可能不需要对数据库进行另一次查询的数据集,大约100个结果,然后在应用程序中将25分页。

通常,索引并使用这些索引缩小结果范围,如果性能是数据库上大量活动的关键,则调整数据库和代码以通过在应用程序中进行分页来减少I / O和数据库命中。您将知道为什么当您的服务器出现负载为12并且您的I / O显示20利用率时。你需要点击手术台统计数据!

答案 4 :(得分:0)

最好使用LIMIT。想一想..即使你有1000000行,第一个也会得到所有。 vs限制,每次只能得到你的设定数字。

然后,您需要确保正确设置了偏移量,以便从表格中获取下一组项目。