下の 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
計算が速いため、最初にチェックを行う可能性がありますが、これは保証されていません。
これを試して:
AND (if(last_name is null,1, sp.last_name
LIKE CONCAT('%',last_name,'%')))
私の知る限り、それは本当です。後者の式を評価せずに行が含まれます。ただし、これは既知のデータセットでテストできます (すべきでしょうか?) 後者の式に副作用 (カウンターのインクリメントなど) を作成させ、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 句で 2 つの式をどのように配置しても、 @foo は常に1 回だけインクリメントされます。