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

完结撒花~

相关推荐
施嘉伟26 分钟前
一次典型的 SQL 性能问题排查:临时表导致的隐藏性能陷阱
数据库·sql
IT_Octopus34 分钟前
java 实体属性 Map 解决 mybatis-plus wrapper selectone 查mysql json类型为null 问题
java·mysql·mybatis
IT 乔峰34 分钟前
分享一个负载均衡的NDB高可用集群架构+部署详细说明
数据库·架构·负载均衡
丁丁点灯o35 分钟前
oracle中基于正则表达式匹配规则提取子串的函数REGEXP_SUBSTR
数据库·oracle·正则表达式
木风小助理36 分钟前
Android 数据库实操指南:从 SQLite 到 Realm,不同场景精准匹配
jvm·数据库·oracle
Elseide艾思39 分钟前
数字经济专利数据库(1994年更新至今)
数据库
IT运维爱好者42 分钟前
docker-compose部署MySQL主从复制集群
mysql·docker-compose
optimistic_chen43 分钟前
【Redis系列】事务特性
数据库·redis·笔记·缓存·事务
踏月的造梦星球44 分钟前
浅究Oracle迁移至DM8产生数据文件膨胀的原因
数据库·oracle
DBA小马哥1 小时前
时序数据库迁移替换与选购指南
数据库·时序数据库