目次
とある日
MySQLのベンチマークについて調べてたら、BENCHMARK
という式や関数の速度を計測できるものを見つけたので試してみた話です。
BENCHMARK
特定の MySQL 式または関数の速度を測定するには、mysql クライアントプログラムを使用して、
BENCHMARK()
関数を呼び出します。 構文はBENCHMARK(*
loop_count*,*
expr*)
です。 戻り値は常に 0 ですが、mysql はステートメントの実行にどのくらいの時間を要したかを表示する行を出力します。
以下サンプル
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はいろんなものがありますね。