helixdigital-io/fast-paginate

[非官方] Laravel 快速分页

v1.0.2 2024-03-13 10:20 UTC

This package is auto-updated.

Last update: 2024-09-13 11:29:19 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 表现更差,尽管这是可能的,因此请务必在您的数据上测试!

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

安装

此包支持 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

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