Laravel集合count()花费的时间太长

时间:2019-02-03 14:28:11

标签: php laravel-5 eloquent

我有一个联系人表和一个contact_list表,一个contact_list有很多联系人,联系人表有一个 is_active 字段。

enter image description here

要获取contact_list的活动联系人数量,我可以使用查询生成器,如下所示:

$contact_list->contacts()->where('is_active', 1)->count();

如果联系人数量太大,查询将花费很长时间。 有没有更好的方法来实现这一点?

2 个答案:

答案 0 :(得分:0)

据我所见,您希望优化请求的性能。

要实现您应该使用eager-loading,因此您的新请求应如下所示:

$contactList = App\ContactList::with(['contacts' => function ($query) {
    $query->where('is_active', 1);
}])->count();

有关Laravel如何实现预加载的更多信息,请查看文档链接:eager-loading documentation

答案 1 :(得分:0)

使用InnoDB时,COUNT()对于具有百万行的表运行缓慢。 这是count()的问题,因为InnoDB引擎会按行锁定表,并且如果要定期更改表,那么count()函数就不容易了。

雄辩的ORM在InnoDB或MyISAM之间没有区别,因此count()进程总是触发类似SELECT COUNT(*) AS aggregate FROM table之类的东西。

如果您使用此SELECT COUNT(1) FROM table来更改查询,您将意识到count()过程会更快。

因此在Laravel中可以简化为:

Model::select(DB:raw('count(1)'))->first();

或者您的情况

$contact_list->contacts()->select()->where('is_active', 1)->count();