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 STATUS
SHOW 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
ステートメントのオプションの構文を知り、