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

これを試して:

AND  (if(last_name is null,1, sp.last_name 
LIKE CONCAT('%',last_name,'%')))
于 2012-07-10T16:53:28.217 に答える
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 句で 2 つの式をどのように配置しても、 @foo は常に1 回だけインクリメントされます。

于 2012-07-10T16:51:47.927 に答える