【MYSQL】IN查询优化

总结:

在 MySQL 5.7 中,如果 WHERE 只作用于主表,但 JOIN 和 ORDER BY 很重,

就应当显式地缩小驱动表;

在 MySQL 8.0 中,优化器可能自动完成,但不能盲目信任。

问题描述:

sql 复制代码
//优化前
select * from 

a 

left join b on b.b=a.b left join... where a.id in (1,2...) order by d.number;
//优化后
select * from 

(select * from a where a.id in (1,2,3...)) t

left join b ... order by d.number;

在 MySQL 8.0 中,优化器相比 5.7 有几项关键增强:

1.更积极的 WHERE 条件下推(Predicate Pushdown)

2.更智能的 JOIN 顺序重排

3.派生表(子查询)可被自动合并(Derived Merge)

4.更成熟的 Cost-Based Optimizer

👉 MySQL 8.0 很可能自动把过滤提前到 JOIN 之前
但要强调的边界条件(很重要) ,以下情况 8.0 也未必能完全自动优化:

1.JOIN 结构极其复杂(多层 LEFT JOIN)

2.WHERE 中混入了 b / c 的条件

3.ORDER BY / GROUP BY 过于复杂

4.存在函数、隐式类型转换

5.统计信息不准确

最后 如果sql已经这样优化,那么在代码层面可以去掉分批查询,基本逻辑都是类似的。

完结撒花~

相关推荐
Decay__8 小时前
12_MySQL InnoDB 内存与锁调优 —— Buffer Pool、redo log、隔离级别与锁等待
运维·数据库·sql·mysql·架构
笃行3509 小时前
AI数据库的库内四层结构,KingbaseES 产品拆解
数据库
我是大猴子11 小时前
redis
数据库·redis·缓存
苏宸啊13 小时前
MySQL(一)
数据库·mysql
2603_9696948513 小时前
JDBC 基础学习笔记:API 核心原理解析与 CRUD 代码实操
数据库·笔记·mysql·学习方法·database·sql注入
这个DBA有点耶14 小时前
库内语义构建 vs 外挂向量库:业务语义缺失,才是RAG“胡说八道”的根源
数据库·mysql·aigc
kobe_OKOK_15 小时前
mysql 开启 binlog 日志
数据库·mysql
鸽芷咕15 小时前
KingbaseES 调参先看执行计划,参数是答案不是起点
数据库
这个DBA有点耶16 小时前
MySQL 8.0直方图:统计信息升级了,执行计划为什么还是选错?
数据库·mysql·代码规范
老纪的技术唠嗑局18 小时前
把 seekdb 塞进 iOS App:让混合检索嵌入手机
数据库