Laravel eloquent withCount()应该比用()慢

时间:2017-11-22 01:20:09

标签: php mysql laravel laravel-5

所以我问这个问题的原因是,在我当前的应用withCount()中,响应时间几乎增加了三倍,只需通过with()获取关系的所有数据,只需从前端获取长度(javascript) )。我认为使用withCount()的目的是加快查询速度,但也许我错了?

例如:

courseSession::where('id', '>=', 1)
->where('id', '<=', 320)
->withCount('enrollments')
->get();

平均响应时间约为900毫秒(调试栏显示为单个数据库调用)

但是

courseSession::where('id', '>=', 1)
->where('id', '<=', 320)
->with('enrollments')
->get();

大约350ms(Debugbar将其显示为两个不同的db调用)

模型关系定义如下:

public function enrollments()
{
   return $this->hasMany(EmployeeEnrollment::class)->where('dropped', '=', null);
}

注意:已经检查过如果我删除了where子句,它只会加速30ms

员工注册表大约是11k行,而运行查询的模型表大约是2k行

这也是在本地开发环境中并在两台独立的机器上进行测试

我对数据库的东西很无能为力,所以我不确定我是否做错了什么......但是对此有任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

区别在于你要求mysql计算语句中的每一行而不是dump。 withCount的重点并不是它更快,如果您需要的只是计数,它在内存上会更好。

例如,我与数千个数据丰富的项目有关系。如果我只是使用with然后尝试计算结果,php将耗尽内存我有机会进行计数。如果我使用withCount,只返回一个项目,告诉我有多少项目,所以对php内存没有任何税,但所有的工作都是在sql server上完成的。