条件化简
- 移除不必要的括号
- 常量传递:某个表达式是某个列和某个常量做等值匹配,当这个表达式和其他涉及该列的表达式使用AND连接起来时,可以将其他表达式中的该参数的值替换为常数;
eg: a=5 AND b>a 可以替换为 a=5 AND b>5
- 等值传递:多个列之间存在等值匹配的关系
- 移除没用条件:明显是TRUE或者是FALSE的表达式可以移除
- 表达式计算:表达式中只包含常量的话,它的值会被先计算出来
HAVING 子句和 WHERE 子句合并
如果查询语句中没有出现诸如SUM、MAX等等的聚集函数以及GROUP BY子句,优化器就把HAVING子句和WHERE子句合并起来
常量表优化
- 查询的表中一条记录也没有或者是只有一条记录
- 使用主键等值匹配或者唯一二级索引等值匹配作为搜索条件来查询某个表
外连接消除
外连接查询中,指定的WHERE子句中包含被驱动表中的列不为NULL值的条件称之为空值拒(英文名:reject-NULL)。在被驱动表的WHERE子句符合空值拒绝的条件后,外连接和内连接可以相互转换
子查询优化
-
标量子查询和行子查询
- 不相关:先执行子查询,然后把上一步的结果当做外层参数进行查询
- 相关:先执行外层查询获取到数据,把相关值作为子查询条件参数查询,如果存在值,保留该条记录。
-
IN子查询优化:
不直接将不相关子查询的结果集当作外层查询的参数,而是将该结果集写入一个临时表里;如果结果集不大,基于内存使用Memory存储引擎建临时表;如果结果集太大,则使用基于磁盘存储引擎建立临时表; -
将子查询转换为semi-join
- Table pullout (子查询中的表上拉):当子查询的查询列表处只有主键或者唯一索引列时,可以直接把子查询中的表上拉到外层查询的FROM子句中,并把子查询中的搜索条件合并到外层查询的搜索条件中
- Table pullout
- DuplicateWeedout
- LooseScan
- Materialization
- FirstMatch
