MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのSLEEP()関数はビジーウェイトなのか?その仕組みと実装方法を解説

MySQLのSLEEP()関数はビジーウェイトか?

結論から言うと、いいえ、MySQLのSLEEP()関数はビジーウェイト(Busy-Wait)ではありません。スリープ中もCPUを回し続けるのではなく、指定した秒数だけスレッドを休止させて処理を一時停止する仕組みになっています。

それでは、実際にテーブルを作成し、SLEEP()関数の動作を確認してみましょう。

1. テーブルの作成

まず、以下のコマンドでサンプル用のテーブルを作成します。

mysql> create table DemoTable(FirstName varchar(100));
Query OK, 0 rows affected (0.57 sec)

2. レコードの挿入

次に、INSERT文を使ってテーブルにデータを追加していきます。

mysql> insert into DemoTable values('John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('Adam');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('Bob');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('Chris');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Robert');
Query OK, 1 row affected (0.16 sec)

3. SLEEP()関数を使ったSELECT文の実行

SELECT文ですべてのレコードを表示します。ここでは、SLEEP()関数も同時に指定しています。

mysql> select sleep(10),FirstName from DemoTable;

実行すると、次のような出力が得られます。

+-----------+-----------+
| sleep(10) | FirstName |
+-----------+-----------+
|         0 | John      |
|         0 | Adam      |
|         0 | Bob       |
|         0 | Chris     |
|         0 | Robert    |
+-----------+-----------+
5 rows in set (50.00 sec)

実行時間が50秒になる理由

SLEEP(10)は行ごとに評価されるため、5行存在するこのテーブルでは、各行に対して10秒ずつ待機が発生し、合計50秒の実行時間となります。

重要なのは、この待機時間中もMySQLはCPUを消費し続けないという点です。ビジーウェイトのようにループで空回りするのではなく、スレッドを休止状態にして待機するため、サーバーへの余計な負荷は発生しません。SLEEP()関数は、クエリの動作検証やレプリケーション遅延のシミュレーションなど、さまざまな場面で活用できる便利な関数です。

  1. MySQLテーブルに候補キー(Candidate Key)を実装する方法

    候補キー(Candidate Key)とはリレーショナルデータベースにおいて、1つのテーブル(リレーション)には1つ以上の候補キーが存在する可能性があります。その中で実際に主キーとして選択されたものが「プライマリキー(Primary Key)」です。すべての候補キーは主キーの候補となり得るため、主キーの候補となるキーを「候補キー(Candidate Key)」と呼びます。MySQLで候補キーを実装するには、UNIQUEキー制約を活用します。複数のカラムに対してユニークキーを設定することで、それぞれのキーが候補キーとして機能します。基本的な構文は以下の通りです。alter table テーブル名

  2. MySQLストアドプロシージャで条件分岐を正しく実装する方法を解説

    MySQLストアドプロシージャにおける条件分岐の基本MySQLのストアドプロシージャ内で条件を設定するには、IF ... THEN ... ELSE ... END IF構文を使用します。基本的な書式は以下のとおりです。if yourCondition then yourStatement1; else yourStatement2; end if; end //この構文を使うことで、条件が真(true)の場合はTHEN以降の処理が実行され、偽(false)の場合はELSE以降の処理が実行されます。 実際の実装例それでは、上記の構文をもとに、具体的なストアドプロシージャを作成し