这个 SQL 查询应该怎么写提高效率?
3

有以下三张表:

  • users (用户表)
    id
    name
  • columns (分类表)
    id
    title
  • articles (文章表)
    id
    title
    column_id

    他们的关联关系是:一个用户可以关注多个分类,一个分类可以用多篇文章
    我简单一下化需求:
    查询十篇文章,必须是用户已经订阅的分类中的。(假设关联都已经设置好)

    // 查询已经关注的分类
    $subscribe_columns = AUth::user()->columns()->select('id')->get()->pluck('id');
    $articles = Article::whereIn('column_id', $subscribe_columns)->paginate(10);

    加入我关注了一千个分类,一万个分类。这样子会感觉效率有问题,是否有更高的查询构造方法?或者这种情况压根不应该用 whereIn

当神不再是我们的信仰,那么信仰自己吧,努力让自己变好,不辜负自己的信仰!

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

效率慢的问题已经解决,原因是框架自带的分页,自己写分页就快了,用框架的分页 3.5 s,自己写 300ms

8个月前
Toiu

尝试使用 Article::whereIn('column', $subscribe_columns)->paginate(10) 来分页, 看会不会有所改善..如果还有其他的关联数据在页面中使用的话,最好先用with预加载

8个月前

@刘滔 我一开始就是使用框架自带的分页,想简单说明一下问题才写成那样的,已修改。 现在已经知道是框架自带的分页使查询速度变慢了。 使用 offset()->limit() 来弄了分页

8个月前

请问是如何测试速度的,我刚学不久,在做个人博客

8个月前

ORM很好用,但是很多性能问题都是ORM框架引起的,不是所有的项目都适合用ORM框架

8个月前

paginate()用的不就是offset() limit()吗? 问题应该出现在count()上吧

8个月前

@lalalalalaTwoEyes 我用的 postman 可以直接捉取时间的。

8个月前

@YuxiangDong 谢谢 :+1:

8个月前

@klgd 里面应该有更复杂的计算,也许是我的前面条件太多影响到了。一个计算 count 应该影响没有这么大

8个月前

可以使用类似 select * from articles where column in ( select id from columns 联查user - columns中间表),这样可以省去多余的传输。我也在做一个类似的需求,不过我那个还要复杂一点,还涉及到了关注的人什么的,还有各种多态模型。其实这些东西从数据库考虑本身就有问题,如果量级达到你所说的会有某个用户关注上千上万的话,你数据库怎么查也撑不住,肯定要从缓存等各方面入手。

8个月前

hasMany

8个月前

@dividez hasMany + 预加载

8个月前

$subscribe_columns = AUth::user()->columns()->pluck('id')->toArray();
$articles = Article::whereIn('column_id', $subscribe_columns)->paginate(10);

8个月前

@Abel94 我那个查询构造器转成 SQL, 应该和你的那个差不多吧。

8个月前

@dividez 我直接这样获取 ID ,不会更快吗?

8个月前

@MehrLicht 哈哈,这个差不多,不纠结。

8个月前

@DavidNineRoc 我想说的是可能toArray()会好点;我直接发现过一个问题,不将对象转换成数组,部分情况下会出现性能问题

8个月前
reallyli

@lalalalalaTwoEyes DB::getQueryLog();

8个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!