优化器为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