MySQL で実行中のクエリを表示する方法のメモ。
以下のように show processlist で実行中のクエリを表示することができます。
この他に、information_schema の PROCESSLIST テーブルで確認することもできます。
INFO が実行中のクエリです。
通常のテーブルと同様に各カラムに対して条件を指定して、実行中のクエリを絞り込むことができます。
mysql コマンドに -c オプションを指定すると、クエリ内のコメントがそのまま INFO に表示されますので、コメントを使ったクエリ絞り込みを考えてみます。。
# QUERY_TYPE: {クエリ種別} の形式のコメントから {クエリ種別} を抽出します。
上記の QUERY_TYPE で group by するとどんなクエリがどれだけ実行されているかを集計することもできます。
以下のように show processlist で実行中のクエリを表示することができます。
show [full] processlist;
この他に、information_schema の PROCESSLIST テーブルで確認することもできます。
mysql> select * from information_schema.PROCESSLIST\G *************************** 1. row *************************** ID: 9 USER: root HOST: localhost DB: NULL COMMAND: Query TIME: 176 STATE: User sleep INFO: select sleep(10000) *************************** 2. row *************************** ID: 8 USER: root HOST: localhost DB: NULL COMMAND: Sleep TIME: 173 STATE: INFO: NULL
INFO が実行中のクエリです。
通常のテーブルと同様に各カラムに対して条件を指定して、実行中のクエリを絞り込むことができます。
mysql> select USER, COMMAND, INFO from information_schema.PROCESSLIST where COMMAND != 'Sleep'\G *************************** 1. row *************************** USER: root COMMAND: Query INFO: select sleep(100)
mysql コマンドに -c オプションを指定すると、クエリ内のコメントがそのまま INFO に表示されますので、コメントを使ったクエリ絞り込みを考えてみます。。
*************************** 1. row *************************** ID: 8 USER: root HOST: localhost DB: NULL COMMAND: Query TIME: 66 STATE: User sleep INFO: select sleep(100) # QUERY: SLEEP_100 *************************** 2. row *************************** ID: 9 USER: root HOST: localhost DB: NULL COMMAND: Query TIME: 3 STATE: User sleep INFO: select sleep(50) # QUERY: SLEEP_50
# QUERY_TYPE: {クエリ種別} の形式のコメントから {クエリ種別} を抽出します。
mysql> select TIME, regexp_substr(INFO, '# QUERY: ([^\r\n]+)') as QUERY_TYPE, INFO from information_schema.PROCESSLIST where COMMAND != 'Sleep'\G *************************** 1. row *************************** TIME: 81 QUERY_TYPE: # QUERY: SLEEP_100 INFO: select sleep(100) # QUERY: SLEEP_100 *************************** 2. row *************************** TIME: 6 QUERY_TYPE: # QUERY: SLEEP_50 INFO: select sleep(50) # QUERY: SLEEP_50
上記の QUERY_TYPE で group by するとどんなクエリがどれだけ実行されているかを集計することもできます。
mysql> select regexp_substr(INFO, '# QUERY: ([^\r\n]+)') as QUERY_TYPE, count(1) as cnt from information_schema.PROCESSLIST where COMMAND != 'Sleep' group by QUERY_TYPE\G *************************** 1. row *************************** QUERY_TYPE: # QUERY: SLEEP_100 cnt: 2 *************************** 2. row *************************** QUERY_TYPE: # QUERY: SLEEP_50 cnt: 1