MySQL-内核查询优化规则


  • 条件化简
    • 移除不必要的括号
    • 常量传递(constant_propagation)
    • 移除没用的条件(trivial_condition_removal)
    • 表达式计算
    • 常量表检测
      • 使用主键等值匹配或者唯一二级索引列等值匹配作为搜索条件来查询某个表,通过这两种方式查询的表称之为常量表
      • 优化器在分析一个查询语句时,先首先执行常量表查询,然后把查询中涉及到该表的条件全部替换成常数,最后再分析其余表的查询成本
    • 外连接消除
      • 有ON子句关联且空值拒绝的时候:外连接和内连接的查询结果没区别
  • 子查询MySQL内部优化规则
    • 按返回的结果集区分子查询
      • 标量子查询
      • 行子查询
      • 列子查询
      • 表子查询
    • 按与外层查询关系来区分子查询
      • 不相关子查询:子查询可以单独运行出结果,而不依赖于外层查询的值
      • 相关子查询:子查询的执行需要依赖于外层查询的值
      • [NOT] IN/ANY/SOME/ALL 子查询
        • IN
          • Memory存储引擎的临时表,而且会为该表建立哈希索引
          • 物化表:结果集太多,可能内存中都放不下,同时建立了索引
          • 物化表转连接
            • 将子查询转换为 semi-join 半连接:对于s1表的某条记录来说,我们只关心在s2表中是否存在与之匹配的记录,而不关心具体有多少条记录与之匹配,最终的结果集中只保留s1表的记录
              • Table pullout (子查询中的表上拉):子查询的查询列表处只有主键或者唯一索引列时,可以直接把子查询中的表上拉到外层查询的FROM子句中,并把子查询中的搜索条件合并到外层查询的搜索条件中
              • DuplicateWeedout execution strategy (重复值消除)、LooseScan execution strategy (松散扫描)、Semi-join Materializationa半连接物化、FirstMatch execution strategy (首次匹配)等等
            • 不能转为semi-join查询的子查询优化
              • 对于不相关子查询来说,会尝试把它们物化之后再参与查询
              • 不管子查询是相关的还是不相关的,都可以把IN子查询尝试转为EXISTS子查询
        • ANY/ALL:转为 select min/max
      • EXISTS子查询
        • 不相关子查询,可以先执行子查询的结果是TRUE还是FALSE,并重写原先的查询语句

文章作者: 钱不寒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 钱不寒 !
  目录