Laravel Eloquent 使查询执行变慢

Posted

技术标签:

【中文标题】Laravel Eloquent 使查询执行变慢【英文标题】:Laravel Eloquent Making Query Execution Slow 【发布时间】:2021-06-23 06:23:04 【问题描述】:

我正在使用 laravel 雄辩的关系并且有缓慢的查询执行问题 假设我有两张桌子 聊天(100 万条记录) 潜在客户(50 万条记录) 我想查询使用的群组的聊天和潜在客户数据

 lead::select("chat_lead_id")->with([chats=>function($q)
    $q->select('chat_id',"group_id")->where("group_id"=>1)
    )

查询调试 第一个查询:

result =select chat_lead_id from leads 

第二次查询

select chat_id,group_id from chats  where group_id =1 AND chat_id in (result)

请检查上面的调试,您可以看到 First Query 将从数据库中获取 50 万行,这将花费很多时间 那么我应该怎么做才能加入查询? 使用 WhereHas 时,它正在放置内部查询,这也需要时间 查询 WhereHas

select * from `gc_od_leads`
    where exists (select * from `gc_od_chat`
            where `gc_od_leads`.`leads_chat_id`
                = `gc_od_chat`.`chat_id`
              and `chat_group_id` = ?)

【问题讨论】:

您正在寻找whereHas 方法。 whereHas 正在做内部查询,这使得速度更慢 您可能需要为 group_id 和 chat_id 添加索引。另一种选择是进行左连接而不是子查询,这将减少查询的数量。 请检查我更新的问题与 wherehas 查询你的意思是我需要继续加入而不是关系 【参考方案1】:

因为你有 50 万行,我认为你应该只 join 你的表:

 $values=lead::query()->join('chats','leads.chat_lead_id','=','chats.chat_id')
            ->where("group_id",=,1)->select(["chat_lead_id",'chat_id',"group_id"])->get();

【讨论】:

我正在使用 join 我只是想确认使用 join 是唯一的解决方案,并且在这些情况下没有雄辩的解决方案吗?? 我发布了这个问题,人们开始说我错了***.com/questions/66815015/… 这里 join 是进行此查询的最快方式,其他方式要慢得多【参考方案2】:
where group_id =1 AND chat_id in (result)

需要这个复合索引:INDEX(group_id, chat_id)

【讨论】:

以上是关于Laravel Eloquent 使查询执行变慢的主要内容,如果未能解决你的问题,请参考以下文章

Laravel / Eloquent - 无法执行原始查询

Laravel Eloquent:返回数组键作为字段 ID

Laravel Eloquent - 查询数据透视表

Laravel Lumen - Eloquent 查询日志

Laravel 验证使用 eloquent 或 raw 查询

如何在 Laravel Eloquent 中构建具有多级关系的查询