【问题标题】:Laravel pagination - Select Count() queryLaravel 分页 - 选择 Count() 查询
【发布时间】:2015-07-03 23:40:58
【问题描述】:

我在查询中使用 Laravel 内置的分页方法,我需要在全文中针对大型数据集(大约 100K 行,每行包含大量文本)进行搜索。

一切正常,除了我不明白 laravel 如何计算结果的逻辑:为什么必须执行两次相同的查询(选择计数()作为聚合)来检索结果的总数,而不是使用php 函数 count(),在这种情况下效果很好。 因为使用这种方法,我可以将搜索时间缩短一半,有时可能需要长达 10 秒!

真的有必要使用 2 查询,还是有可能以某种方式覆盖这个逻辑? 或者也许是我在这个逻辑背后遗漏了什么?

【问题讨论】:

  • 在分页时如何使用 PHP 计数? PHP count 将返回每页的项目数,而不是整个项目的计数。这就是为什么你必须两次,一次计算所有项目,另一次获取受您指定的数量和偏移量(页面)限制的项目
  • 我做了一个var_dump(count($results)),它返回集合的总数,而不是每页的计数,与 select count() 给出的数字相同

标签: php laravel pagination


【解决方案1】:

查询执行两次,一次获取最终查询返回的总记录数,第二次只返回需要的数据集。

所以,如果你有一个 100,000 条记录的表,第一个查询将统计 SQL 查询返回的记录,假设有 8,900 条记录符合您的要求,它将返回一个整数 8,900。

然后第二个查询使用您想要的页码,将其乘以每页计数,然后仅从该页返回相关的 15 条左右的记录,即 SQL 查询中的 LIMIT 和 OFFSET 值。

值得注意的是,GROUP BY 分页结果的处理方式不同。如果将 GROUP BY 添加到 eloquent 中任何 SQL 语句的末尾,它会返回一个 SQL 查询。此查询获取所有相关数据集,计算返回的行数,然后对数组进行切片以仅返回您需要的 15 条左右的记录。

这两种方法的区别在于第一种方法返回 2 个微小的查询响应。首先是总数,其次是表中的 15 个左右的数据集。

GROUP 选项为符合您的 SQL 要求的每条记录返回一个数据集。如果总共有 8,900 条记录,则总共有 8,900 个 eloquent 模型对象。

如您所见,如果您的数据库中有大量记录,则第二种方法虽然可以更快地执行 SQL 语句,但会占用更多资源。

如果您的 SQL 语句执行两次的时间过长,您可能需要考虑优化您的表,或添加更多的 INDEX。只是一个想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 2012-11-30
    • 2021-11-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多