mysql 为什么我的拉拉维尔恋情进展缓慢?

pcrecxhr  于 2023-03-17  发布在  Mysql
关注(0)|答案(1)|浏览(88)

我的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));

任何人都可以帮助我使这个查询更快,并告诉我我的问题?

thtygnil

thtygnil1#

即使是分页为25的糟糕的优化查询,也应该能够相当快地执行。如果在本地运行,它可能会受到硬件的影响。
在关系加载中存在一些误解。如果您使用关系方法和get()执行查询(如$this->customers()->with('customeruser')->get()),则每次调用它时都会执行一个查询,如果您使用with()包含所有数据,并仅访问关系(如$this->customers),则只需3个查询就可以获取相同的数据,而之前是1个初始值。25个客户查询和一个客户用户查询。
更改代码。首先使用with加载所有数据,这将使laravel对所有SetIndustrialEstate执行关系客户获取,作为单个查询。同时还执行点符号,以类似方式获取客户用户。

SetIndustrialEstate::orderBy('set_industrial_estates.id', 'DESC')
    ->with('customers.customeruser')
    ->paginate(25)

将资源更改为实际使用关系,而不是执行新查询。

'customers' => $this->customers,

如前所述,对于大量的数据,即使是优化得很差的查询也应该运行得很快,因此,确保关系之间存在索引将提高SQL的性能。您可以在此处阅读Laravel中的操作方法。虽然示例可能如下所示,但假设您使用的是MySQL,它会自动创建外键索引。

Schema::table('customers', function (Blueprint $table) {
    $table->unsignedBigInteger('set_industrial_estate_id');
 
    $table->foreign('set_industrial_estate_id')->references('id')->on('set_industrial_estates');
});

相关问题