Orm订单关联用户600w条数据云数据库卡

orm生成的sql如下

select
  *
from
  `yoshop_order`
where
  `p_type` = 'is_tuan'
  and exists (
    select
      *
    from
      `yoshop_user`
    where
      `yoshop_order`.`user_id` = `yoshop_user`.`user_id`
      and `mobile` = '17768632282'
  )
order by
  `order_id` desc
limit
  20 offset 0

问题描述

laravel版本 5.8.*

用户表4w,订单表600w, 使用 dcat-admin(也是使用的laravel-orm),代码如下

return Grid::make(PinOrder::with('user'), function (Grid $grid) {});

订单表索引

订单表p_type字段类型(应该不是null不走索引的)

我的排查

借助Laravel Telescope - Laravel获取到执行的sql,然后使用EXPLAIN分析sql。

分析结果

分析结果符合预期,但是把EXPLAIN去掉后在执行查询数据,就会卡住不会动。我该如何优化他。


ps: 在下面的帮助下,我使用join跑了下sql结果正常,但是这个问题 可不可以由laravel的orm覆写那些方法解决。尽量在用dcat-admin的情况下不去写sql,使用orm直接解决。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

LEFT JOIN 试试

3年前 评论
讨论数量: 6

LEFT JOIN 试试

3年前 评论
ma6plus

exists 不如 left join 快。这个用了 mysql function,而且使用了 临时表

3年前 评论

可优化空间很大! :joy:

3年前 评论

问题已解决

  $grid->model()
                ->leftJoin('yoshop_user',"yoshop_order.user_id",'=',"yoshop_user.user_id")
                ->where("yoshop_order.p_type",'=','is_tuan');
//                ->orderBy("yoshop_order.order_id",'desc');
3年前 评论

问一下数据库版本多少,据说MySQL8.x有提升

3年前 评论
laisxn

明确mobile,用户应该同一个了吧,分两句sql,不要关联,通过mobile在用户表找出id,在去订单表找,大表能不关联就不要关联

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!