friendsofhyperf/fast-paginate

Hyperf 的快速分页

v3.1.31 2024-06-17 01:41 UTC

README

https://github.com/hammerstonedev/fast-paginate 分支

关于

这是一个为 Hyperf 设计的快速 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
    )

尝试运行上面的查询可能会出错!类似 这个版本的 MySQL 还不支持 'LIMIT & IN/ALL/ANY/SOME subquery. 在这个包中,我们将它们作为 两个 独立的 查询 来解决这个问题!

好处可能会因您的数据集而异,但这种方法允许数据库检查尽可能少的数据来满足用户的意图。

这种方法不太可能比传统的 offset / limit 表现得更差,尽管这是可能的,所以请确保在您的数据上测试!

如果您想阅读有关本包理论的 3,000 字文章,可以访问 aaronfrancis.com/2022/efficient-pagination-using-deferred-joins

安装

此包支持 Hyperf 3.0+。

要安装,请通过 composer 需求此包

composer require friendsofhyperf/fast-paginate

您不需要做任何事情。服务提供者将由 Hyperf 自动加载。

使用

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

也支持关系

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

一个善举

如果您觉得这有助于您,请 资助我 之前和之后的时间!我很乐意知道 :D

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

联系

许可证

MIT