MySQL 8.0版本说明
MySQL 8.0源代码文档10bet官方网站
MySQL可以执行相同的优化col_name
为空
它可以用来col_name
=
constant_value
.例如,MySQL可以使用索引和范围来搜索零
与为空
.
例子:
Select * fromtbl_name在哪里key_col是零;Select * fromtbl_name在哪里key_col< = >零;Select * fromtbl_name在哪里key_col=const1或key_col=const2或key_col是零;
如果一个在哪里
条款包括col_name
为空
声明为的列的条件非空
,这个表达式被优化掉了。这种优化在可能产生列的情况下不会发生零
无论如何(例如,如果它来自一个表的右边左连接
).
MySQL也可以优化组合
,一种在已解析子查询中常见的形式。col_name
=expr
或col_name
为空解释
显示ref_or_null
当使用此优化时。
这个优化可以处理一个为空
对于任何关键部分。
一些优化的查询示例,假设列上有一个索引一个
而且b
的表t2
:
SELECT * FROM t1 WHERE t1.a=expr或t1。一个是零;SELECT * FROM t1, t2 WHERE t1.a=t2a或t2。一个是零;SELECT * FROM t1, t2 WHERE (t1.a=t2;a或t2。一个为空)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
首先读取引用键,然后单独搜索带有零
键值。
优化只能处理一个为空
的水平。在下面的查询中,MySQL只对表达式使用键查找(t1.a = t2。a和t2。一个为空)
并不能使用关键部分上b
:
SELECT * FROM t1, t2 WHERE (t1.a=t2;a和t2。一个为空)或(t1.b=t2.b AND t2.b IS NULL);