所以我问这个的原因是,在我当前的应用程序 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();
大约 350 毫秒(调试栏将其显示为两个不同的数据库调用)
模型关系定义如下:
public function enrollments()
{
return $this->hasMany(EmployeeEnrollment::class)->where('dropped', '=', null);
}
注意:已经检查过,如果我删除 where 子句,它只会加快 30 毫秒
员工登记表大约有 11k 行,我正在运行查询的模型表大约有 2k 行
这也在本地开发环境中,并在两台单独的机器上进行了测试
我对数据库的东西有点无能,所以我不确定我是否做错了什么......但是任何帮助都将不胜感激
最佳答案
不同之处在于您要求 mysql 计算语句中的每一行,而不是仅仅转储。 withCount 的意义不在于它更快,如果您只需要一个计数,它对内存的好处就更大。
例如,我与数以千计的数据丰富的项目有关系。如果我只是使用 with 然后尝试计算结果,php 将耗尽内存我永远有机会进行计数。如果我使用 withCount,只会返回一个项目,告诉我有多少项目,因此不会占用 php 内存,但所有工作都在 sql server 上完成。
关于php - Laravel Eloquent withCount() 应该比 with() 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47425371/