#### 8.2.1.15 IS NULL 优化

[](<>)[](<>)

MySQL 可以执行相同的优化*`col_name`* [`一片空白`](comparison-operators.html#operator_is-null)它可以用于*`col_name`* `=` *`常量值`*.例如，MySQL 可以使用索引和范围来搜索`空值`和[`一片空白`](comparison-operators.html#operator_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;
```

如果一个`在哪里`子句包括一个*`col_name`* [`一片空白`](comparison-operators.html#operator_is-null)声明为的列的条件`非空`，那个表达式被优化掉了。在列可能产生的情况下不会发生这种优化`空值`无论如何（例如，如果它来自右侧的表`左连接`）。

MySQL还可以优化组合`*`col_name`* = *`表达式`* 要么 *`col_name`* 一片空白`，一种常见于已解析子查询的形式。[`解释`](explain.html)节目[`ref_or_null`](explain-output.html#jointype_ref_or_null)使用此优化时。

这种优化可以处理一个[`一片空白`](comparison-operators.html#operator_is-null)对于任何关键部分。

一些经过优化的查询示例，假设列上有索引`一种`和`b`表的`t2`：

```
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`](explain-output.html#jointype_ref_or_null)首先读取引用键，然后单独搜索带有`空值`核心价值。

优化只能处理一个[`一片空白`](comparison-operators.html#operator_is-null)等级。在以下查询中，MySQL 仅对表达式使用键查找`（t1.a=t2.a AND t2.a 为空）`并且无法使用关键部分`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);
```
