2

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

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

3 回答 3

2

MySQL 可以自由地以任一顺序执行比较。

它很可能会NULL首先进行检查,因为它的计算速度更快,但这并不能保证。

于 2012-07-10T16:51:15.690 回答
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。

于 2012-07-10T16:51:47.927 回答
2

试试这个:

AND  (if(last_name is null,1, sp.last_name 
LIKE CONCAT('%',last_name,'%')))
于 2012-07-10T16:53:28.217 回答