所以我这么问的原因是,在我当前的应用程序中,响应时间几乎是通过withCount()
获取关系的所有数据和从前端(javascript)获取长度的三倍。我认为使用with()
的目的是加快查询速度,但也许我错了?
例如:
courseSession::where('id', '>=', 1)
->where('id', '<=', 320)
->withCount('enrollments')
->get();
平均响应时间约为900ms(debugbar将此显示为单个DB调用)
但是
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子句,它只会加速30毫秒
Employee Enrollment表大约有11k行,我正在运行查询的模型的表大约有2k行
这也在本地dev env上,并在两台独立的机器上测试
我有点不懂数据库的东西,所以我不确定我是不是做错了什么。。。但如果你能帮忙
最佳答案
不同的是,您要求mysql计算语句中的每一行,而不仅仅是转储。withCount的关键不是它更快,而是如果你只需要一个计数,它的内存会更好。
例如,我与成千上万的数据丰富项有关系。如果我只是使用with,然后尝试计算结果,php将耗尽内存,我有机会进行计算。如果使用withCount,则只返回一个项目,告诉我有多少个项目,因此对php内存不征税,但所有工作都在sql server上完成。