基于规则的优化

MySQL会对用户编写的查询语句执行一些重写操作,比如:

  • 移除不必要的括号

  • 常量传递

  • 移除没用的条件

  • 表达式计算: 最好让那个索引列以单独的形式出现在搜索条件表达式中。

  • HAVING子句和WHERE子句的合并:如果查询语句中没用出现诸如 SUM,MAX这样的聚集函数以及GROUP BY子句,查询优化器就会把HAVING子句和WHERE子句合并起来。

  • 常量表的检测 :查询优化器在分析一个查询语句时,首先执行常量表查询,然后把查询中涉及该表的条件全部 替换成常数,最后再分析其余表的查询成本。

在被驱动表的WHERE子句符合空值拒绝的条件时,外连接和内连接可以相互转换,子查询可以按照不同的维度进行不同的分类,比如按照子句查询返回的结果分类:

  • 标量子查询:只返回一个单一值的子查询。
  • 行子查询 :返回一条记录的子查询。(包含多列)
  • 列子查询 :查询出一个列的数据。(包含多行)
  • 表子查询:子查询的结果既包含很多行,又包含很多列。

按照与外层查询的关系分类:

  • 不想关子查询 :子查询可以单独运行出结果,不依赖外层查询的值。
  • 相关子查询:子查询的执行需要依赖于外层查询的值。

IN子查询有很多优化,如果IN子查询符合转换为半连接的条件,查询优化器会优先把该子查询转化为半连接,然后再考虑下面5种执行半连接查询的策略中哪个成本最低,最后选择成本最低的执行策略来执行子查询。

  • Table pullout
  • Duplicate Weedout
  • LooseScan
  • Seni-join Materialization
  • FirstMatch

如果IN子查询不符合转换为半连接的条件,查询优化器会从下面两种策略中找出一个成本更低的方式执行子查询。

  • 先将子查询物化,再执行查询
  • 执行INEXISTS的转换

你可能感兴趣的:(基于规则的优化)