如果下面的last_name为NULL,它是否会跳过该列的WHERE比较以提高性能?
AND (last_name IS NULL OR sp.last_name LIKE CONCAT('%',IFNULL(last_name, ''),'%'))
答案 0 :(得分:2)
MySQL可以按任意顺序自由执行比较。
最有可能首先进行NULL
检查,因为计算速度更快,但这不能保证。
答案 1 :(得分:2)
据我所知,这是事实,它将包括行而不评估后一个表达式。但是,这可以(应该?)使用已知数据集进行测试,方法是使后一个表达式创建副作用(例如递增计数器),并在针对last_name列中仅使用NULL的数据集运行之前和之后检查计数器。
对于好奇:
+------+
| 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,'%')))