如何在大型数据库上优化 whereHas 的性能?

问题描述 投票:0回答:1

这是我的代码:这个查询太慢了,当我运行它时,我的 MySQL 服务器崩溃了。

->when($this->search, function ($query) {
      return $query->where(function ($query) {
           $query->where('fullname', 'like', '%'.$this->search.'%')
           ->orWhere('phone', 'like', '%'.$this->search.'%')
           ->orWhere('email', 'like', '%'.$this->search.'%')
           ->orWhereHas('services', function ($query) {
               $query->where('number', 'like', '%'.$this->search.'%');
            });
     });
 })

我使用 php 8.1.4,我想搜索数字形式关系,如何在没有 whereHas 的情况下做到这一点?

php mysql laravel bigdata wherehas
1个回答
0
投票

如果您的服务表不多,那应该不是问题,但如果它很大,您可能需要按数字预查询和缓存服务表,例如

if (is_numeric($this->search)) {
    //10 minutes cache
    $servicesByNumber = Cache::remember('sbnum_'.$this->search, 600, function() {
    //replace foreign_id below with actual foreign key
    return Service::where('number', 'like', "%$this->search%")->pluck('foreign_id');
});

}

然后

->when($this->search, function ($query) {
      $query->where(function ($query) {
           $query->where('fullname', 'like', '%'.$this->search.'%')
           ->orWhere('phone', 'like', '%'.$this->search.'%')
           ->orWhere('email', 'like', '%'.$this->search.'%');
      if (isset($servicesByNumber))
           $query->orWhereIn('id', $servicesByNumber);
     });
 })
© www.soinside.com 2019 - 2024. All rights reserved.