MySQLの状況を知る
MySQLの状況を確認するといえば、
今回は
SHOW STATUSステートメント
MySQLではmysqldの稼働中にステータス変数と呼ばれる変数を持っており、
SHOW STATUSステートメントはMySQL内部のステータス変数にアクセスし、
mysql> SHOW STATUS; +-----------------------------------------------+--------------------------------------------------+ | Variable_name | Value | +-----------------------------------------------+--------------------------------------------------+ | Aborted_clients | 0 | .. | Uptime_since_flush_status | 603979 | +-----------------------------------------------+--------------------------------------------------+ 356 rows in set (0.00 sec)
ドキュメントのSHOW STATUS構文にも記載がありますが、SHOW STATUSステートメントの利用方法をざっくりとまとめます。
- 一般的な用途で利用する場合は
SHOW GLOBAL STATUSとGLOBAL修飾子を使う。GLOBAL修飾子を指定しない場合、セッションスコープのステータス変数が表示される (後述) - 表示項目を絞って表示させるには
LIKE '変数名ワイルドカード'またはWHERE 式が利用できる。WHERE句ではWHERE variable_のような式が記述できるが、name LIKE .. AND value > 10000 変数名以外でマッチさせることはまれ - セッションスコープ、
グローバルスコープとも SHOW STATUSの実行に特別な権限は必要ない。MySQLに接続さえできればどのユーザーでも表示可能
ステータス変数のスコープ
ステータス変数にはセッションスコープSHOW STATUSはSHOW SESSION STATUSSHOW LOCAL STATUS)
SHOW SESSION STATUS, SHOW GLOBAL STATUSと両スコープの表示関係は以下の表のようになっています。
| ステートメント | グローバルスコープのみ | セッションスコープのみ | 両スコープあり |
|---|---|---|---|
SHOW SESSION STATUS | グローバルスコープの値 | セッションスコープの値 | セッションスコープの値 |
SHOW GLOBAL STATUS | グローバルスコープの値 | 表示されない | グローバルスコープの値 |
一般的にステータス変数にアクセスする際はMySQL全体の状況を確認する目的が多く、SELECTステートメントが何回実行されたかをカウントアップするCom_ステータス変数であれば、SHOW STATUS LIKE 'Com_SELECTステートメントが実行されたか)SHOW GLOBAL STATUS LIKE 'Com_SELECTステートメントが実行されたか)
mysql> SHOW STATUS LIKE 'Com_select'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_select | 3 | +---------------+-------+ 1 row in set (0.00 sec) mysql> SHOW GLOBAL STATUS LIKE 'Com_select'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_select | 539 | +---------------+-------+ 1 row in set (0.00 sec)
セッションスコープでステータス変数を確認するのは、Handlerで始まるステータス変数はMySQLの低レイヤーなAPIの呼び出し回数を記録するステータス変数ですが、
mysql> SELECT * FROM t1 ORDER BY val LIMIT 3; .. 3 rows in set (0.00 sec) mysql> SHOW STATUS LIKE 'Handler%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Handler_commit | 1 | | Handler_delete | 0 | | Handler_discover | 0 | | Handler_external_lock | 2 | | Handler_mrr_init | 0 | | Handler_prepare | 0 | | Handler_read_first | 1 | | Handler_read_key | 1 | | Handler_read_last | 0 | | Handler_read_next | 2 | | Handler_read_prev | 0 | | Handler_read_rnd | 0 | | Handler_read_rnd_next | 0 | | Handler_rollback | 0 | | Handler_savepoint | 0 | | Handler_savepoint_rollback | 0 | | Handler_update | 0 | | Handler_write | 0 | +----------------------------+-------+ 18 rows in set (0.00 sec)
出力結果の絞り込み
SHOW GLOBAL STATUS LIKE '..'の構文を用いて、SHOW STATUS LIKE 'Com_ は "_" が任意の一文字にマッチしてしまうため厳密にはLIKE 'Com\_select'とするべきかもしれませんが、
WHEREを用いた式による記述も可能ですが、LIKEのみおぼえておけば概ね問題ないと思われます。
ステータス変数にどのようなものがあるかは
概ね"Com_%", "Handler_%", "Innodb_%", "Qcache_%"などのように系統立てた名前がついているため、
FLUSH STATUSによくある誤解
まれに、FLUSH STATUSステートメントを利用しようとしている人を見かけることがありますが、
ドキュメントにも記載がありますが、FLUSH STATUSステートメントは
まとめ
MySQL内部のステータス変数を確認することで、
ステータス変数にはセッションスコープとグローバルスコープがあり、
ステータス変数にアクセスするためのSHOW STATUSステートメントのオプションの構文を知り、
