mysql-查询重写
优化器为sql进行重写叫做查询重写
1. 条件简化
移除不必要的括号
常量传递 a=5 and b>a 转化为a=5 and b>5
等值传递 a=b and b=c and c=5; 转化为a=5 and b = 5 and c = 5;
移除没用的条件 移除永远为true 或 false的条件
表达式计算
having和where的合并 语句中没有出现sum max以及group by 优化器会把having和where合并
常量表检测
外连表消除
子查询优化
2. 子查询的执行方式
标量子查询 行子查询
对于不相关标量子查询/行子查询 就先执行子查询,在以子查询的结果作为条件 去执行外部查询
相关标量子查询/行子查询 先从外查询中取出一条记录 然后用这个值 去进行子查询 符合放入结果集 反复执行
in查询优化
物化:当in中有子查询,并且子查询的结果很多是,就将子查询结果存入临时表 并建立唯一索引去重,数量小就基于内存 否则基于磁盘 这个表叫做物化表
半连接semi-join:对于表a和表b来说,只关心b表中是否有与a表匹配的数据,不关心有多少条,如果有就只吧a的数据放入结果集
如何实现半连接:
1. 子查询的结果只有主键或唯一索引列 直接将in转为from a,b on a.id = b.id 因为主键和唯一索引 数据唯一 所以可以直接转
2. 先不关心是否有重复的数据直接将in转join 在放入结果集的时候 创建唯一索引的临时表 将记录放入临时表中 成功放入的话 也放入结果集
3. 松散索引扫描 在子查询中的记录去除重复记录中的一条,去外表匹配 成功放入结果集
exists:将in转化为exists
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!