【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已经这样优化,那么在代码层面可以去掉分批查询,基本逻辑都是类似的。

完结撒花~

相关推荐
ccddsdsdfsdf5 小时前
DBeaver怎么链接mongoDB
数据库·mongodb
丷丩6 小时前
Postgresql基础实践教程(十一)各种Join
数据库·postgresql·join
星夜夏空996 小时前
FreeRTOS学习(4)——内存映射
数据库·学习·mongodb
TheRouter7 小时前
AI Agent 记忆体系建设实战:短期、长期与工作记忆的工程实现
数据库·人工智能·oracle
Omics Pro7 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
唐青枫7 小时前
MySQL EXISTS 详解:存在性判断、NOT EXISTS 与实战示例
sql·mysql
JAVA面经实录9178 小时前
Hibernate面试题库
数据库·oracle·hibernate
2301_773643628 小时前
华为云存储实验
网络·mysql·华为云
迷枫7128 小时前
DM8 目录结构与常用排查入口梳理
服务器·数据库
Mr.Daozhi10 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具