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_language
和 db1.id
创建复合索引:
$table->index(['kuchikomi_language', 'id']);
这将加快where('db1.kuchikomi_language', $language)
语句的速度。
之后,如果这部分查询需要很长时间才能执行,您可以尝试使用过滤器而不是 whereIn('db1.id', $splitted_id))
语句。您可以使用Laravel Debugbar 对此进行分析。
这将使您能够在过滤拆分的 id 之前和/或之后缓存结果,具体取决于过滤需要多长时间。
分页可能不是性能问题的原因,但也可以分析一下。
【讨论】:
以上是关于Laravel 加入分页的主要内容,如果未能解决你的问题,请参考以下文章