2015-11-05 98 views
0

当至少有1万行的记录处理,在性能方面,是它更好地:Paginate通过PHP与MySQL最佳实践?

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

分页结果

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

+0

@RyanVincent因为表现是主题,所以假设大记录。 – IMB

+0

@RyanVincent你为什么一直在删除你的评论 – IMB

回答

0

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

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

1

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

1

这取决于。

  1. 此表中数据经常变化吗?

是 - >您需要查询数据库。

  1. 数据库很大,经常变化吗?

然后使用某种像Elasticsearch搜索引擎,不查询DB只是填充搜索引擎

  • 是数据库虽小,但查询需要很长一段时间?
  • 使用缓存的某种类似的Redis /内存缓存

    这真的取决于你的需求。

    1

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

    当您进入后续页面时,天真的LIMIT方法会给您带来问题。 ORDER BY some_key LIMIT偏移量,page_size的工作原理是这样的 - 通过按键,通过第一个偏移量记录,然后返回page_size记录。所以偏移量+ page_size记录检查,如果偏移量是高你有问题。

    更好 - 记住当前页面的最后一个键值。当读取一个页面使用这样的:

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

    如果您的密钥不是唯一的,使其独特通过在末尾添加一个额外的唯一ID列。

    +0

    是的,这比使用'OFFSET'更好。 [更多讨论](http://mysql.rjweb.org/doc.php/pagination)。 –

    1

    它真的取决于上下文。

    一般而言,您希望大量使用索引来选择您希望从大型数据集中快速获得结果的内容。通过编程语言进行分页比使用数据库更快。数据库往往是瓶颈。我们必须以这种方式为具有100多个查询的应用程序这样做。打到数据库的命中需要加盖,所以我们需要将我们知道可能不需要另一个查询的数据集返回给数据库,大约100个结果,然后在应用程序中分页25。

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