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

 

posted @   rudynan  阅读(365)  评论(0编辑  收藏  举报
编辑推荐:
· 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 让容器管理更轻松!
点击右上角即可分享
微信分享提示