我正在使用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索引-
我的问题是-连接操作是否适合此大小的表?如果是,我如何改善执行时间?需要一些帮助来解决这些疑问。谢谢。
答案 0 :(得分:2)
由于where语句是导致性能问题的原因,因此您可以尝试通过在迁移中执行以下操作来为db1.kuchikomi_language
和db1.id
创建一个复合索引:
$table->index(['kuchikomi_language', 'id']);
这将加快where('db1.kuchikomi_language', $language)
语句的速度。
此后,如果查询的这一部分需要很长时间才能执行,则可以尝试使用过滤器代替whereIn('db1.id', $splitted_id))
语句。您可以使用Laravel Debugbar对此进行分析。
这将使您有可能在过滤拆分的ID之前和/或之后缓存结果,具体取决于过滤所花费的时间。
分页可能不是造成性能问题的原因,但也可以对此进行分析。