MySQL查询优化之IS NULL的优化

原文地址:https://dev.mysql.com/doc/refman/5.7/en/is-null-optimization.html

译文:

8.2.1.13 IS NULL 优化

MySQL可以对col_name IS NULL执行与col_name = constant_value相同的优化。例如,MySQL可以使用索引和范围搜索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的条件,且col_name列声明为非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);

PS:由于水平有限,译文中难免存在错误,欢迎批评指正。

猜你喜欢

转载自blog.csdn.net/qq_41080850/article/details/85345136