1.12 IS NULL Optimization is null 查询的优化
mysql能够完成同样的优化在col_name is null,通过采用col_name=constant_value来完成。例如,mysql可以使用索引或者是范围扫描来查找null值对于is null的查询。
例如:
SELECT * FROM tbl_name WHERE key_col IS NULL;
SELECT * FROM tbl_name WHERE key_col <=> NULL;
SELECT * FROM tbl_name
WHERE key_col=const1 OR key_col=const2 OR key_col IS NULL;
如果where条件中包含了col_name is null条件,而其中列的值已经被声明为not null,那么表达式会优化。这种优化不会发生,当该列的值可能是null的情况下,例如,如果该列的值来自一个左连接的右侧的表。
mysql也能够优化对于结合col_name=expr or col_name is null,该形式通常被解析为子查询。当优化器被使用,那么EXPLAIN展示ref_or_null。
优化器能够处理任何关键字部分的is null。
一些会被优化的查询的例子,假设在表t2中a和b列中有一个索引。
SELECT * FROM t1 WHERE t1.a=expr OR t1.a IS NULL;
SELECT * FROM t1, t2 WHERE t1.a=t2.a OR t2.a IS NULL;
SELECT * FROM t1, t2
WHERE (t1.a=t2.a OR t2.a IS NULL) AND t2.b=t1.b;
SELECT * FROM t1, t2
WHERE t1.a=t2.a AND (t2.b=t1.b OR t2.b IS NULL);
SELECT * FROM t1, t2
WHERE (t1.a=t2.a AND t2.a IS NULL AND ...)
OR (t1.a=t2.a AND t2.a IS NULL AND ...);
ref_or_null处理过程为首先对参考索引值进行读取,然后在单独对行中有null值的情况做查询。
优化器能够处理值有一个is null级别,在下面的查询中,mysql只在表达式(t1.a=t2.a and t2.a is null)上使用索引查询,并且不能在索引的部分属性列b上使用索引。
SELECT * FROM t1, t2
WHERE (t1.a=t2.a AND t2.a IS NULL)
OR (t1.b=t2.b AND t2.b IS NULL);
到此关于is null的优化就结束了,接下来我们要说明的是1.13ORDER BY Optimization(ORDER BY 的优化)