0

次のようなクエリがあります。

SELECT t1, t2,
IF(MATCH(t2) AGAINST ('input*' IN BOOLEAN MODE), 10, 0) AS matches,
IF(t2 LIKE '%input%', 2, 0) AS similar
FROM tbl
WHERE t2 LIKE '%input%'
ORDER BY (matches + similar) DESC
LIMIT 5

クエリは正常に機能しますが、私が懸念しているのは、MySQLがt2がLIKE'%input%'であるかどうかを2回チェックしているかどうか、または最初の結果をキャッシュしているかどうかです(これはすばらしいでしょう!)。

ありがとう

4

1 に答える 1

0

申し訳ありませんが、そうではありません。

貧乏人のテストとして、次のことを考慮してください。

delimiter //
create function qqq() 
returns int no sql 
begin 
  set @x:=@x+1; 
  return 17; 
end //
delimiter ;

set @x := 0;
select qqq(), qqq(), qqq() > 1, qqq() > 1 from dual;
+-------+-------+-----------+-----------+
| qqq() | qqq() | qqq() > 1 | qqq() > 1 |
+-------+-------+-----------+-----------+
|    17 |    17 |         1 |         1 |
+-------+-------+-----------+-----------+

select @x;
+------+
| @x   |
+------+
|    4 |
+------+

これは特殊なケースであると主張できますが、組み込み関数ではなくストアド ルーチンを呼び出しているため、現時点では違いはありません。すべてが再評価されます。

これは将来変更される可能性があります。よく知られている決定論的な関数でこの最適化が行われるのを厳密に防ぐものは何もありません。しかし、これはオプティマイザーによる診断が難しい場合があります。

于 2012-07-14T12:27:15.203 に答える