zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    禅道安装
    logstash将配置写在多个文件
    原版Filebeat+ELK
    Filebeat+ELK部署文档
    A-2---Jenkins安装
    Linux ftp服务器搭建
    linux 网络命令
    yum安装时出现No more mirrors to try.
    kvm 修改虚拟机密码
    NFS安装
  • 原文地址:https://www.cnblogs.com/isnotnull/p/14437564.html
Copyright © 2011-2022 走看看