dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

MySQL で実行中のクエリを表示

2023-10-21 12:41:17 | mysql
MySQL で実行中のクエリを表示する方法のメモ。
以下のように 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