如果下面的 last_name 为 NULL,它会跳过该列的 WHERE 比较以提高性能吗?
AND (last_name IS NULL OR sp.last_name LIKE CONCAT('%',IFNULL(last_name, ''),'%'))
如果下面的 last_name 为 NULL,它会跳过该列的 WHERE 比较以提高性能吗?
AND (last_name IS NULL OR sp.last_name LIKE CONCAT('%',IFNULL(last_name, ''),'%'))
MySQL 可以自由地以任一顺序执行比较。
它很可能会NULL
首先进行检查,因为它的计算速度更快,但这并不能保证。
据我所知,这是真的,它将包含该行而不评估后一个表达式。但是,这可以(应该?)使用已知数据集进行测试,方法是让后一个表达式产生副作用(例如递增计数器)并在针对 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。
试试这个:
AND (if(last_name is null,1, sp.last_name
LIKE CONCAT('%',last_name,'%')))