【发布时间】:2019-01-07 20:40:31
【问题描述】:
目前,我有很多使用 Group By 等的 Join 和 SubJoins。
简而言之:我不能使用分页,因为它太慢了(因为 Group by)。这就是为什么我需要手动使用分页,但是,我也需要限制总行数。行数超过 10k,我希望总共有 300 个的最大值!
我目前的方法效果不佳,我真的不知道如何解决它:
return \DB::table('offers')
->alotOfQueries/joins
->...
->limit(300) //we show only a maximum of 300 offers
->get();
返回后,我手动创建分页。
我也将代码留在这里:
protected function paginate(Collection $offerings): LengthAwarePaginator
{
$page = request()->page ?? 1;
$perPage = $this->config->take;
$offset = ($page * $perPage) - $perPage;
return new LengthAwarePaginator(
array_slice($offerings->all(), $offset, $perPage, true),
$offerings->count(),
$perPage,
$page,
[
'path' => request()->url(),
'query' => request()->query()
]
);
}
这种当前的方法比使用分页要快得多。
但我的问题是它仍在加载 300 行。
我的目标是每页只加载 18 行。并计算正确的总数,直到达到 300。它不会超过。
这些数字来自 Airbnb,所以我可以给你看这张照片,所以你可能知道我在做什么:
Airbnb 总是将其最大总数限制为 300。因为加载了 18 行,所以我们得到 17 页。
知道如何解决这个问题吗?
【问题讨论】:
-
"这种当前的方法比使用分页要快得多。" - 这似乎是倒退的,因为使用分页,您只获取您需要的结果集,而不是 300 多条记录,然后手动切片记录。除非您的连接等与
COUNT()查询发生冲突(分页将执行两个查询:计算所有记录,然后限制/偏移当前页面)。我建议发布您的实际查询,看看是否可以优化。 -
早上好@AkenRoberts,抱歉回复晚了。我将添加 sql 查询。使用调试栏我看到
COUNT()的查询大约需要 1.68 秒......在我使用分页之前,整个 ajax 请求只用了大约 0.75 秒......
标签: laravel