求 SQL 优化建议

Vesc · 2024-8-26 09:57:58 · 260 次点击
A 表 40w 数据
B 表 42W 左右,
A 和 B 是一对多的关系,现在需要分页查询所以如果用 Aleft join B 数据会变多,group by 的话速度很慢,
目前用的 select * from A where exists ( select 1 from B where a.order_id = b.order_id )
页面有些查询条件存在 A 有的存在 B ,查询条件速度很慢,B 的查询条件页面响应速度在 6s 左右,看 sql 执行需要 2.5s
举报· 260 次点击
登录 注册 站外分享
22 条回复  
a7851578 小成 2024-8-27 11:00:28
不给表结构和索引,还有 explain 怎么建议
justNoBody 小成 2024-8-26 17:57:38
我尝试自己建了一个 OP 说的数据场景( 40w+42w 做 left join 和 group by ),但是我秒出,ms 级。

OP 看看能不能造个数据库发出来吧,把数据脱敏一下或者是重新跑一个新的库表
wangritian 小成 2024-8-26 16:41:10
A 表加字段缓存 where exists ( select 1 from B where a.order_id = b.order_id )的结果如何?
rm0gang0rf 小成 2024-8-26 16:30:41
A 订单 240w, B sku 720w, 比你慢点
Xrall 小成 2024-8-26 16:11:44
我也有类似的疑惑。MySQL 中查询

select r.* from t_event_record r inner join t_event_workflow_record wr on r.id = wr.event_id
where wr.user_id = 1 and wr.status= 1
group by r.id order by r.create_time desc limit 10

主表 10w 数据 子表 40w+ 就这查询就需要 500ms
count 查询一样的需要 500 ms
explain 一个 index 一个 ref 慢的不得了
就疑惑的很是不是查询就这么慢。
aw2350 小成 2024-8-26 15:58:00
先从 B 中查出 需要的 A 的 id ,
with queryB as(
select distinct(A.id) from B where  xxx)

select  * from A INNER JOIN  queryB on  queryB.AID= A.ID
zemo 小成 2024-8-26 15:38:44
分页查询,有 limit,关联字段有索引应该不会慢呀, 主要就是查处满足条件的 a 数据再做关联,避免全量关联就会快很多,确认走到索引了吗?
KOMA1NIUJUNSHENG 初学 2024-8-26 14:30:57
先查 id 集合,再用 id 查完整数据
xiaohang427 初学 2024-8-26 13:59:53
可以贴下 SQL ,我现在用 PG ,交易表大概 4000W 条数据,有个终端表大概几 W ,也是用 JOIN 方式。后来想改为 IN 条件,但是条件太多会造成索引失效。还是要具体问题具体对待
tbv 小成 2024-8-26 13:47:17
子查询还不如 join 呢
123下一页
返回顶部