Laravel 加入分页

Posted

技术标签:

【中文标题】Laravel 加入分页【英文标题】:Laravel join with pagination 【发布时间】:2019-06-10 07:44:36 【问题描述】:

我正在使用 laravel(v-5.6) 分页。我有两个表:table1 大小~160 万行,table2 大小~80 万行。我正在根据某些条件执行连接操作。我的查询如下-

$results = $connection->table('table1' as db1")
                ->select('db1.id as kuchikomi_id','db1.comment as splitted_kuchikomi','db1.kuchikomi_sentiment','db1.status as kuchikomi_status','db2.id','db2.hotel_id','db2.comment','db2.post_date','db2.ota_name','db2.negative_comment','db2.positive_comment','db2.language')
                ->Join('table2' as db2", 'db1.kuchikomi_id', '=', 'db2.id')
                ->where('db1.kuchikomi_language', $language)
                ->whereIn('db1.id', $splitted_id))
                ->paginate(100);

这里的 $splitted_id 是约 60 万个 ID 的集合。当我执行此查询时,它需要超过 12 分钟并因超过最大执行时间而终止。

table1 索引 -

db1.kuchikomi_language db1.id

我的问题是 - 连接操作是否适合这种大小的表?如果是,我怎样才能提高执行时间?需要一些帮助来解决这些疑问。谢谢。

【问题讨论】:

在数百万条记录表上连接应该不是问题。但是这些表上有索引吗? 去掉where语句和分页是不是更快? @Jerodev 是的,对于表 1 2 索引 1.关于 kuchikomi_language,2.关于评论。 id 是主键。 @piscator : 是的,它会在 20 秒内给出结果。 我同意@piscator,我想再提一提的是,我认为paginate 在这里并不是最佳选择,因为它需要获取检索到的行数,如果数据很大,可能会加起来,尝试用take 替换paginate,以确保您能更快地获取数据 【参考方案1】:

由于 where 语句是导致性能问题的原因,您可以尝试通过在迁移中执行以下操作来为 db1.kuchikomi_languagedb1.id 创建复合索引:

$table->index(['kuchikomi_language', 'id']);

这将加快where('db1.kuchikomi_language', $language) 语句的速度。

之后,如果这部分查询需要很长时间才能执行,您可以尝试使用过滤器而不是 whereIn('db1.id', $splitted_id)) 语句。您可以使用Laravel Debugbar 对此进行分析。

这将使您能够在过滤拆分的 id 之前和/或之后缓存结果,具体取决于过滤需要多长时间。

分页可能不是性能问题的原因,但也可以分析一下。

【讨论】:

以上是关于Laravel 加入分页的主要内容,如果未能解决你的问题,请参考以下文章

laravel的分页系统,怎么获取他的total

laravel5自定义分页

laravel 分页小技巧(不使用laravel自带的分页情况下)

Laravel分页

Laravel分页

[ Laravel 5.5 文档 ] 数据库操作 —— 在 Laravel 中轻松实现分页功能