我的Laravel项目中有3个模特
Customers、SetIndustrialEstate和CustomerUser。我在客户模型中构建了如下简单关系:
public function setindustrialestate()
{
return $this->belongsTo('App\Models\SetIndustrialEstate');
}
public function customeruser()
{
return $this->hasMany('App\Models\CustomerUser');
}
在我的房地产模型中,我有:
public function customers()
{
return $this->hasMany('App\Models\Customer','set_industrial_estate_id');
}
我有大约50.000个条目的客户和客户用户。也有大约2000个条目的工业地产。加载时间是真的很慢(2分钟加载),如果我试图获得客户的设置工业地产与客户用户。但为什么呢?
我的工业地产资源是这样的:
'customers' => $this->customers()->with('customeruser')->get(),
这也是我的查询,只获取SetIndustrialEstates的分页,并加载客户,包括customeruser:
return IndustrialEstateResource::collection(SetIndustrialEstate::orderBy('set_industrial_estates.id', 'DESC')->paginate(25));
任何人都可以帮助我使这个查询更快,并告诉我我的问题?
1条答案
按热度按时间thtygnil1#
即使是分页为25的糟糕的优化查询,也应该能够相当快地执行。如果在本地运行,它可能会受到硬件的影响。
在关系加载中存在一些误解。如果您使用关系方法和
get()
执行查询(如$this->customers()->with('customeruser')->get()
),则每次调用它时都会执行一个查询,如果您使用with()
包含所有数据,并仅访问关系(如$this->customers
),则只需3个查询就可以获取相同的数据,而之前是1个初始值。25个客户查询和一个客户用户查询。更改代码。首先使用with加载所有数据,这将使laravel对所有SetIndustrialEstate执行关系客户获取,作为单个查询。同时还执行点符号,以类似方式获取客户用户。
将资源更改为实际使用关系,而不是执行新查询。
如前所述,对于大量的数据,即使是优化得很差的查询也应该运行得很快,因此,确保关系之间存在索引将提高
SQL
的性能。您可以在此处阅读Laravel
中的操作方法。虽然示例可能如下所示,但假设您使用的是MySQL
,它会自动创建外键索引。