多对多关系的问题,whereHas查询很慢,大概要十几秒,怎么解决呐?

文章表(articles)

id , title …

推荐表(recommends)

id , title …

推荐文章表(articles_recommends)

id,article_id,recommend_id

分类表(categories)

id name ….

文章分类表(articles_categories)

id,article_id,category_id

  1. 文章表 多对多关联 分类表
  2. 文章表 多对多关联 推荐表

请问,已知推荐表的ID 为 1 分类的ID 为2

查询 文章推荐表的recommend_id = 1 并且 文章分类表的 categroy_id = 2的所有文章怎么查询?

目前:

Recommend::find(1)->articles()->whereHas('categories',function ($q) {
            $q -> where('category_id',2);
        })->limit(10)->get();

这样的查询很慢,数据库文章大概有一两万, 关联表大概也有一两万,查询速度很慢,将近20多秒,想提问一下大佬,怎么解决查询很慢的这个问题,并且优雅的解决。。。

JiaHeng
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7

has 全表扫描 建议用 inner join 改写

2年前 评论
Epona

你可以先用原生SQL 在 SQL里面看看使用了多长时间,如果时间差不多,那么说明是SQL端的问题。另外你这些外键有没有加 索引什么的。 最后 可以使用。SQL 的。explain 功能来看看到底是哪里有问题。

2年前 评论
JiaHeng

@Epona 开始的时候 文章数比较少 这样写 看不出啥来 后面一同步数据 问题就出来了 查询出了 9000多条文章 然后 ,每个文章又去筛选是否是当前ID

file

如何在查询article 之前 关联 other 并筛选ID 呐?

2年前 评论

1.查看原生sql 对比响应速度 2.数据量大时避免使用whereHas(这是一个子查询)来进行连表查询 改用join关联查询 3.数据量大时建立合适的索引(百万级以上)

2年前 评论

你应该试试通过 articles 表去查推荐是 1 分类再是 2 的数据

或者可以尝试自己写一些子语句去解决

2年前 评论

1 先跑原生 2 再跑框架封装的 哪个快用哪个 如果不在乎性能就用框架的整 就行了

2年前 评论

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