MySQL和跳过WHERE谓词

时间:2012-07-10 16:47:56

标签: mysql

如果下面的last_name为NULL,它是否会跳过该列的WHERE比较以提高性能?

AND (last_name IS NULL OR sp.last_name LIKE CONCAT('%',IFNULL(last_name, ''),'%'))

3 个答案:

答案 0 :(得分:2)

MySQL可以按任意顺序自由执行比较。

最有可能首先进行NULL检查,因为计算速度更快,但这不能保证。

答案 1 :(得分:2)

据我所知,这是事实,它将包括行而不评估后一个表达式。但是,这可以(应该?)使用已知数据集进行测试,方法是使后一个表达式创建副作用(例如递增计数器),并在针对last_name列中仅使用NULL的数据集运行之前和之后检查计数器。

编辑:经测试v5.5.25

对于好奇:

+------+
| name |
+------+
| NULL |
+------+
| Bill |
+------+

下面的每个查询都以set @foo=0;开头,然后会显示select @foo;的结果。

SELECT name FROM names WHERE (@foo:=@foo+1 OR name IS NULL);
-- 1 (did optimize) - same without parenthesis

SELECT name FROM names WHERE name IS NULL OR (@foo:=@foo+1);
-- 1 (did optimize)

SELECT name FROM names WHERE (@foo:=@foo+1) OR name IS NULL;
-- 2 (did not optimize)

有趣的是,我无法生成未以这种方式优化的更新查询。即无论我如何在where子句中安排两个表达式,总是只增加@foo一次。

答案 2 :(得分:2)

试试这个:

AND  (if(last_name is null,1, sp.last_name 
LIKE CONCAT('%',last_name,'%')))