mysql的多对多关联查询很慢,请教原因及解决办法

Mysql 5.7.26
PHP 7.4

PostCategory 分类表 有两条分类信息:id为1和2

中间表
id为1 有15万左右的关联信息
id为2 有8万左右的关联信息

posts 文章表
有二十万左右的文章

PostCategory::query()->where('id', 1)
->with(['posts' => function ($query) {
$query->where(['post_status' => 'publish', 'post_type' => 'post'])
->latest('post_date')
->limit(10);
}])->first();

文章表加了索引 post_status, post_type, post_date,中间表也有索引
分类表查询id为1的时候速度很快,100毫秒左右,当查询id为2就会很慢,查询时间在7秒左右
请问是什么原因呀

附言 1  ·  2年前

知道问题怎么出现的了,
查询后要post_date(最新时间)排序
文章有22万,最后的三万文章都属于id为1的分类,属于分类id为2的最新文章从文章id为19万的时候才出现

当我把最新的三万文章的分类id为1的文章关联改成分类2后,分类id为1的查询速度就变慢了,分类id为2的查询速度快的飞起

目前只知道出现的原因,但是不知道为什么出现

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 20

可以尝试安装这个包分析一下看一下结果:

github.com/guanguans/laravel-soar

2年前 评论
cwj (楼主) 2年前
Luson

10万左右的数据不应该这么慢

2年前 评论

@Luson 对呀,就只是把查询的id由1变为2,就变得贼慢,mysql分析索引都命中,而且查询方式都一样,

2年前 评论

把正文字段分出去呢?

2年前 评论

@hoogl 分出去的话,在相同的查询条件下,id为1 的查询速度还是比id为2查询速度快了5倍左右

2年前 评论
circle

查询时间是纯 sql 执行的时间吗

2年前 评论
颠倒的玉石

你用纯sql试试ID是1和2的时间看看

2年前 评论

@circle 对,就是纯sql查询

2年前 评论

@颠倒的玉石 纯sql查询1为不到10毫秒,2为将近八秒

2年前 评论

查看mysql连接池

2年前 评论

@PHPer技术栈 请问跟连接池有什么关系呀

2年前 评论

看扫描行数多大

2年前 评论

@bbdd 无论id为1还是2,explain分析的都一样 file SELECT you_posts.*, post_category_post.category_id AS pivot_category_id, post_category_post.post_id AS pivot_post_id FROM you_posts inner join post_category_post ON you_posts.ID = post_category_post.post_id WHERE post_category_post.category_id IN (1) AND ( post_status = 'publish' AND post_type = 'post' ) ORDER BY post_date DESC LIMIT 10

2年前 评论
bbdd 2年前
cwj (作者) (楼主) 2年前
circle

如果把查询条件中的 order by 去掉,速度会变快吗

2年前 评论

@circle 会的,去掉order by,他们两个速度一样快 我看数据库最新的五万数据都是id为1的,其后才开始出现id为2的数据,我感觉跟他们出现的顺序有关

2年前 评论
陈先生

如果这样的话,只能建议你把orderby 加进索引了。时间戳索引试试

2年前 评论

@陈先生 加了,且索引都命中了

2年前 评论

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