Laravel分页

时间:2019-01-16 08:56:22

标签: mysql database laravel join pagination

我正在使用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是〜0.6百万个ID的集合。当我执行此查询时,它花费了超过12分钟的时间,并且由于超出了最大执行时间而终止。

table1索引-

  • db1.kuchikomi_language
  • db1.id

我的问题是-连接操作是否适合此大小的表?如果是,我如何改善执行时间?需要一些帮助来解决这些疑问。谢谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

这将使您有可能在过滤拆分的ID之前和/或之后缓存结果,具体取决于过滤所花费的时间。

分页可能不是造成性能问题的原因,但也可以对此进行分析。