hammerstone/fast-paginate

为Laravel的快速分页

v1.1.1 2024-05-16 15:45 UTC

This package is auto-updated.

Last update: 2024-09-16 16:33:29 UTC


README

关于

这是一个为Laravel设计的快速limit/offset分页宏。它可以用来替代标准的paginate方法。

这个包使用了一种类似于“延迟连接”的SQL方法来实现这种加速。延迟连接是一种在应用offsetlimit之后延迟访问所需列的技术。

在我们的案例中,我们实际上并没有进行连接,而是使用一个where in与子查询。使用这种技术,我们创建一个可以与特定索引优化以获得最大速度的子查询,然后使用这些结果来获取完整的行。

SQL看起来像这样

select * from contacts              -- The full data that you want to show your users.
    where contacts.id in (          -- The "deferred join" or subquery, in our case.
        select id from contacts     -- The pagination, accessing as little data as possible - ID only.
        limit 15 offset 150000      
    )

运行上述查询可能会出错!可能是类似这样的错误:This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery. 在这个包中,我们将它们作为两个独立的查询来解决这个问题!

优点会根据你的数据集而变化,但这种方法允许数据库尽可能少地检查数据以满足用户的意图。

这种方法不太可能比传统的offset / limit表现得更差,尽管这是可能的,所以请务必对你的数据进行测试!

如果你想了解这个包的理论,可以访问aaronfrancis.com/2022/efficient-pagination-using-deferred-joins,阅读3,000字的内容。

安装

此包支持Laravel 8、9和10。(Laravel 8必须是8.37或更高版本。)

要安装,请通过composer要求包

composer require hammerstone/fast-paginate

无需执行其他操作。服务提供程序将由Laravel自动加载。

使用

在任何可以使用Model::query()->paginate()的地方,您都可以使用Model::query()->fastPaginate()!就是这样!方法的签名是相同的。

还支持关系

User::first()->posts()->fastPaginate();

一件好事

如果这对你有帮助,请发推文给我,带上前后时间!我很乐意知道 :D

到目前为止的一些社区结果