私は答えを調べていて、よりコンパクトで更新された答えを提供することにしました。
決定論的関数は、データベースの同じ状態で同じ入力パラメーターが与えられた場合、常に同じ結果を返します。例:POW、SUBSTR()、UCASE()。
非決定論的関数は、データベースの同じ状態で同じ入力パラメーターが与えられた場合、必ずしも同じ結果を返すとは限りません。例:CURDATE()、RAND()、UUID()。
MySQL8.0リファレンスマニュアルにはこれに関するいくつかの更新があります
8.2.1.20関数呼び出しの最適化
MySQL関数は、内部的に決定論的または非決定論的としてタグ付けされています。関数の引数に固定値が与えられた場合、呼び出しごとに異なる結果を返す可能性がある場合、関数は非決定的です。非決定論的関数の例:RAND()、UUID()。関数に非決定論的タグが付けられている場合、WHERE句での関数への参照は、すべての行(1つのテーブルから選択する場合)または行の組み合わせ(複数のテーブルから選択する場合)に対して評価されます。 -table join).MySQLは、引数がテーブル列であるか定数値であるかに関係なく、引数のタイプに基づいて関数を評価するタイミングも決定します。テーブルの列を引数として取る決定論的関数は、その列の値が変更されるたびに評価する必要があります。非決定論的関数は、クエリのパフォーマンスに影響を与える可能性があります。たとえば、一部の最適化が利用できない場合があります。以上のロックが必要になる場合があります。以下の説明ではRAND()を使用していますが、他の非決定論的関数にも適用されます。
MySQL8.0リファレンスマニュアルのこのコード例。テーブルを作成してから、id列1から49のような49行と、49行まで「AA」、「AB」、「AC」のような一意の文字列をcol_aでデータに入力できます。実際には15行を実行できますが、ランダム関数のトピックである49を15に変更する必要があります。
CREATE TABLE t (id INT NOT NULL PRIMARY KEY, col_a VARCHAR(100));
SELECT * FROM t WHERE id = POW(1,2);
SELECT * FROM t WHERE id = FLOOR(1 + RAND() * 49);
このコードは、MySQL8.0リファレンスマニュアルが作成しようとしている要点を説明するのに役立ちます。うまくいけば、これは感謝に役立ちます!