求 SQL 优化建议

75 天前
 Vesc

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

3743 次点击
所在节点    数据库
36 条回复
Geon97
75 天前
@Vesc group by 的字段加索引,或者直接用 join
andytao
75 天前
2.5s 对于数据量大、网络状态不好的话,算正常吧。

需要进一步确认时间卡在哪里:
连接?索引?数据汇合?数据传输?客户端显示?
MoYi123
75 天前
把 explain 贴出来看看, 如果里面有 hash semi join ,那就说明是机器性能太差了, 否则就是 sql 要改.
nianlifeixing
75 天前
exists 不一定最优,A exists B ,A 的数据量大,不要考虑 exists ,大多数情况下一定有条件,不可能查询所有有关联的 A 的信息,可能 A 的数据量有 20w ,不可能统一都给前端把,还是得看场景
Vesc
75 天前
@andytao #22 单纯的 sql 执行时间
tbv
75 天前
子查询还不如 join 呢
xiaohang427
75 天前
可以贴下 SQL ,我现在用 PG ,交易表大概 4000W 条数据,有个终端表大概几 W ,也是用 JOIN 方式。后来想改为 IN 条件,但是条件太多会造成索引失效。还是要具体问题具体对待
KOMA1NIUJUNSHENG
75 天前
先查 id 集合,再用 id 查完整数据
zemo
75 天前
分页查询,有 limit,关联字段有索引应该不会慢呀, 主要就是查处满足条件的 a 数据再做关联,避免全量关联就会快很多,确认走到索引了吗?
aw2350
75 天前
先从 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
Xrall
75 天前
我也有类似的疑惑。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 慢的不得了
就疑惑的很是不是查询就这么慢。
rm0gang0rf
75 天前
A 订单 240w, B sku 720w, 比你慢点
wangritian
75 天前
A 表加字段缓存 where exists ( select 1 from B where a.order_id = b.order_id )的结果如何?
wenxueywx
75 天前
@Vesc #15 的测试有结果了吗?
justNoBody
75 天前
我尝试自己建了一个 OP 说的数据场景( 40w+42w 做 left join 和 group by ),但是我秒出,ms 级。

OP 看看能不能造个数据库发出来吧,把数据脱敏一下或者是重新跑一个新的库表
a7851578
74 天前
不给表结构和索引,还有 explain 怎么建议

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1067739

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX