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

原文地址:https://www.cnblogs.com/isnotnull/p/14437564.html