求 SQL 优化建议

Vesc · 2024-8-26 09:57:58 · 262 次点击
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
举报· 262 次点击
登录 注册 站外分享
22 条回复  
fengpan567 小成 2024-8-26 10:06:03
不要用子查询,用 join B ,再加个<if>条件判断,如果没有 B 的查询字段,直接跳过 join 只查 A 表
ZZ74 小成 2024-8-26 10:06:36
查询条件只有 order_id ?优化 sql 不如优化索引
Geon97 小成 2024-8-26 10:08:43
数据库架构是什么?什么索引?什么引擎? group by 的字段是索引吗?使用 join 的方式呢?
jov1 小成 2024-8-26 10:08:47
这个要看具体情况,比如你查出来的列表不需要 b ,只需要 a 的字段,可以考虑下面这两种,结合执行计划看下索引命中情况。如果 ab 联表查询慢,但是单独查 b 的情况不慢,也可以程序中先单独根据条件查符合 b 的 order_id 再执行 a 的查询

select distinct a.xx, a.xx,a.xx
from a
join b on a.order_id  = b.order_id
where
a.xx = ?
and b.xx=?
或者
select a.xx, a.xx,a.xx
from a
where a.order_id in (
        select order_id from b where order_id is not null
        and xxx=? and xxx=?
)
venicid 初学 2024-8-26 10:30:43
我们经常这么使用,仅供参考
select * from
(
select * from A
where A.xx = xxx
) as t
left join b on  t.order_id = b.order_id
flyfanc 小成 2024-8-26 10:38:41
可能是 mysql 优化的锅,慢的时候执行一下 analyze table 有奇效
Gravitysrainbow 小成 2024-8-26 10:42:10
where exists ( select 1 from B where a.order_id = b.order_id )
cccvno1 小成 2024-8-26 11:00:57
建议先分析 sql 的执行计划,再去执行优化。相同的查询在不同版本不同配置下都可能会出现不同的执行计划
wenxueywx 初学 2024-8-26 11:05:20
#15 似乎可行,值得尝试,欢迎 op 测试后回复一下
123下一页
返回顶部