所以我问这个问题的原因是,在我当前的应用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行
这也是在本地开发环境中并在两台独立的机器上进行测试
我对数据库的东西很无能为力,所以我不确定我是否做错了什么......但是对此有任何帮助将不胜感激
答案 0 :(得分:1)
区别在于你要求mysql计算语句中的每一行而不是dump。 withCount的重点并不是它更快,如果您需要的只是计数,它在内存上会更好。
例如,我与数千个数据丰富的项目有关系。如果我只是使用with然后尝试计算结果,php将耗尽内存我有机会进行计数。如果我使用withCount,只返回一个项目,告诉我有多少项目,所以对php内存没有任何税,但所有的工作都是在sql server上完成的。