MySQLでは標準でさまざまな組み込み関数を用意しています。これらはステートメントの以下のようなポイントで使用できます。
- SELECTステートメントのORDER BYやHAVING句
- SELECTステートメントの取得するリスト内
- SELECT、DELETEやUPDATEステートメントのWHERE句
今回は、その中でも
BENCHMARK()関数
はじめにBENCHMARK()関数です。BENCHMARK()関数では、特定の式や関数の実行速度を測定することができます。ステートメントの実行にどのくらいの時間を要したかを表示する行を出力します。構文はBENCHMARK(count,expr)で、exprをcountの回数だけ繰り返し実行します。
mysqlコマンドラインクライアントでMySQLへアクセスして、BENCHMARK()関数を実行してみましょう。
mysql> SELECT BENCHMARK(1000000,HEX(100*1000)); +-----------------------------------+ | BENCHMARK(1000000,HEX(100*+1000)) | +-----------------------------------+ | 0 | +-----------------------------------+ 1 row in set (0.03 sec)
この例ではHEX(100*1000)
という式を100万回試行したところ、0.
時間がかかったことがわかります。報告される時間は、クライアント側での経過時間を示しており、サーバー側でのCPU時間ではありません。サーバーの負荷状況を正確に理解するためには、BENCHMARK()関数を複数回実行して結果を分析する必要があります。
また、BENCHMARK()を用いて異なるサーバー間の速度の違いを比較することができます。
注意として、評価する式にクエリを含めることは可能ですが、複数のカラムや複数の行が返されるクエリはエラーとなります。その際はサブクエリにして単一行および単一のカラムとなるように工夫する必要があります。
mysql> SELECT BENCHMARK(10000,(SELECT 1,2)); ERROR 1241 (21000): Operand should contain 1 column(s)
mysql> SELECT BENCHMARK(10000,(SELECT 1 FROM (SELECT 1,2) a LIMIT 1)); +--------------------------------------------------------+ | BENCHMARK(10000,(SELECT COUNT(*) FROM (SELECT 1,2) a)) | +--------------------------------------------------------+ | 0 | +--------------------------------------------------------+ 1 row in set (0.01 sec)
BENCHMARK()関数では、特定のクエリや計算の効率を評価し、最適化の必要性を判断することができます。たとえば、同じクエリを異なるデータベース設定やインデックス構成で実行することで、パフォーマンスのボトルネックを特定する手助けになります。また、結果の分析を通じて、サーバーのリプレイスやバージョンアップ、設定変更がどの程度の効果を持つかを事前に予測することも可能です。
ROW_COUNT()関数
ROW_
mysql> insert into t0(col1) values (1),(2),(3); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() | +-------------+ | 3 | +-------------+ 1 row in set (0.00 sec)
この関数は影響を受けた
mysql> UPDATE t0 SET col1=3; Query OK, 2 rows affected (0.00 sec) Rows matched: 3 Changed: 2 Warnings: 0 mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() | +-------------+ | 2 | +-------------+ 1 row in set (0.00 sec)
STATEMENT_DIGEST_TEXT()関数
STATEMENT_
mysql> SELECT STATEMENT_DIGEST_TEXT('SELECT * FROM t0 WHERE col1 = 10000') as text; +-------------------------------------+ | text | +-------------------------------------+ | SELECT * FROM `t0` WHERE `col1` = ? | +-------------------------------------+
これにより、正規化した形式で類似のクエリをグループ化するなどの応用が可能になります。また、出力結果はperformance_
VALIDATE_PASSWORD_STRENGTH()関数
VALIDATE_
mysql> INSTALL COMPONENT 'file://component_validate_password'; Query OK, 0 rows affected (0.28 sec)
mysql> SELECT VALIDATE_PASSWORD_STRENGTH('AbCdEfG'); +---------------------------------------+ | VALIDATE_PASSWORD_STRENGTH('AbCdEfG') | +---------------------------------------+ | 25 | +---------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT VALIDATE_PASSWORD_STRENGTH('Ab!dE$gH*JK^&!lO1'); +-------------------------------------------------+ | VALIDATE_PASSWORD_STRENGTH('Ab!dE$gH*JK^&!lO1') | +-------------------------------------------------+ | 100 | +-------------------------------------------------+ 1 row in set (0.00 sec)
パスワードの戻り値は、以下のロジックに従い導出されます。
条件 | 戻り値 |
---|---|
長さが4文字以下 | 0 |
長さが4文字以上、validate_ |
25 |
validate_ |
50 |
validate_ |
75 |
validate_ |
100 |
詳細は、第228回 MySQLのvalidate_
まとめ
今回は、知っておくと得するかもしれないMySQLの組み込み関数として、MySQLの組み込み関数の中から以下の4つの関数を紹介しました。
- BENCHMARK():パフォーマンス測定
- ROW_
COUNT():DMLによる影響行数取得 - STATEMENT_
DIGEST_ TEXT():SQLの正規化 - VALIDATE_
PASSWORD_ STRENGTH():パスワード強度の評価
この他にも、MySQLには多種多様な関数が用意されています。興味のある方は公式ドキュメント 14.