今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、MySQLに式と関数の速度を測定できるものがあったの日。

目次

とある日

MySQLベンチマークについて調べてたら、BENCHMARKという式や関数の速度を計測できるものを見つけたので試してみた話です。

BENCHMARK

特定の MySQL 式または関数の速度を測定するには、mysql クライアントプログラムを使用して、BENCHMARK() 関数を呼び出します。 構文は BENCHMARK(*loop_count*,*expr*) です。 戻り値は常に 0 ですが、mysqlステートメントの実行にどのくらいの時間を要したかを表示する行を出力します。

MySQL :: MySQL 8.0 リファレンスマニュアル :: 8.13.1 式と関数の速度の測定

以下サンプル

mysql> SELECT BENCHMARK(1000000,1+1);
+------------------------+
| BENCHMARK(1000000,1+1) |
+------------------------+
|                      0 |
+------------------------+
1 row in set (0.32 sec)

ちなみに、自分の検証環境でやると以下の結果となりました。

mysql> SELECT BENCHMARK(1000000,1+1);
+------------------------+
| BENCHMARK(1000000,1+1) |
+------------------------+
|                      0 |
+------------------------+
1 row in set (0.01 sec)

ストアドファンクションで検証

BENCHMARK関数は、式や関数を第2引数に指定できます。

なので、ストアドファンクションを指定した場合でも実行できるのか気になるのでやってみます。

まずは、MySQLが用意しているVERSIONで実行してみます。

mysql>  SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.28    |
+-----------+
1 row in set (0.00 sec)

mysql> SELECT BENCHMARK(1000000,VERSION);
ERROR 1054 (42S22): Unknown column 'VERSION' in 'field list'
mysql> SELECT BENCHMARK(1000000,VERSION());
+------------------------------+
| BENCHMARK(1000000,VERSION()) |
+------------------------------+
|                            0 |
+------------------------------+
1 row in set (0.00 sec)

ちゃんと関数として定義する必要があるみたいです。

次はストアドファンクションを作成します。

公式のドキュメントにあるサンプルを使ってます。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.15 CREATE PROCEDURE および CREATE FUNCTION 構文

mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) DETERMINISTIC RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.01 sec)

mysql>  SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)

mysql> SELECT BENCHMARK(1000000,hello('world'));
+-----------------------------------+
| BENCHMARK(1000000,hello('world')) |
+-----------------------------------+
|                                 0 |
+-----------------------------------+
1 row in set (4.71 sec)

ちゃんとストアドファンクションの引数を指定して実行します。

たまたま見つけたものですが、MySQLはいろんなものがありますね。