friendsofhyperf / fast-paginate
Hyperf 的快速分页
资助包维护!
huangdijia
hdj.me/sponsors
Requires
- friendsofhyperf/helpers: ~3.1.0
- hyperf/database: ~3.1.0
- hyperf/event: ~3.1.0
- hyperf/paginator: ~3.1.0
- hyperf/tappable: ~3.1.0
This package is auto-updated.
Last update: 2024-09-25 00:30:01 UTC
README
关于
这是一个为 Hyperf 设计的快速 limit
/offset
分页宏。它可以替代标准的 paginate
方法。
该包使用类似于“延迟连接”的 SQL 方法来实现加速。延迟连接是一种技术,它将访问请求的列推迟到 在 应用了 offset
和 limit
之后。
在我们的情况下,我们实际上并没有进行连接,而是使用一个子查询的 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
到目前为止的一些社区结果