MySQLで同時接続数の上限や現在の接続状況を確認するには、max_connections・Threads_connected・Max_used_connectionsを使う。
参考: 【PostgreSQL】接続数の上限と現在の接続数を確認する
max_connectionsで接続数の上限を確認する
MySQLで同時接続数の上限を確認するには、max_connections変数をSHOW VARIABLESで確認する。
mysql> SHOW VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
SQLで扱いたい場合はperformance_schema.global_variablesを参照する。
mysql> SELECT VARIABLE_VALUE FROM performance_schema.global_variables
-> WHERE VARIABLE_NAME = 'max_connections';
+----------------+
| VARIABLE_VALUE |
+----------------+
| 151 |
+----------------+
Threads_connectedで現在の接続数を確認する
現在の接続数を確認するには、Threads_connectedステータス変数をSHOW STATUSで確認する。
mysql> SHOW STATUS LIKE 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 1 |
+-------------------+-------+
3つのクライアント接続でクエリを実行中に確認すると、値が増えているのが分かる。
mysql> SHOW STATUS LIKE 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 4 |
+-------------------+-------+
Threads_connectedにはevent_schedulerのようなMySQL内部のバックグラウンドスレッドも含まれる。
PostgreSQLのpg_stat_activityはbackend_type列でclient backendに絞り込めるが、MySQLのThreads_connectedにはクライアント接続のみを取り出す仕組みがなく、内部スレッドの分だけ実際のクライアント接続数より多く見える。
Max_used_connectionsで過去のピーク接続数を確認する
サーバー起動後、同時に使われた接続数の最大値を確認するには、Max_used_connectionsステータス変数を使う。
mysql> SHOW STATUS LIKE 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 5 |
+----------------------+-------+
Threads_connectedが現在の接続数を表すのに対し、Max_used_connectionsは過去のピーク値を保持し続ける。
接続が減っても値は下がらないため、一時的なアクセス集中があったかどうかを後から確認できる。
mysql> SHOW STATUS LIKE 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 1 |
+-------------------+-------+
mysql> SHOW STATUS LIKE 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 5 |
+----------------------+-------+
Max_used_connections_timeステータス変数(MySQL 8.0.30以降)を確認すると、ピークを記録した日時も分かる。
mysql> SHOW STATUS LIKE 'Max_used_connections_time';
+----------------------------+---------------------+
| Variable_name | Value |
+----------------------------+---------------------+
| Max_used_connections_time | 2026-08-20 15:05:57 |
+----------------------------+---------------------+
Max_used_connectionsはFLUSH STATUSを実行するとリセットされる。
mysql> FLUSH STATUS;
mysql> SHOW STATUS LIKE 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 1 |
+----------------------+-------+
SHOW PROCESSLISTで接続の内訳を確認する
接続元ユーザーごとの内訳を確認するには、performance_schema.processlistをUSER列で集計する。
mysql> SELECT USER, COUNT(*) AS cnt
-> FROM performance_schema.processlist
-> WHERE USER != 'event_scheduler'
-> GROUP BY USER
-> ORDER BY cnt DESC;
+------------+-----+
| USER | cnt |
+------------+-----+
| app_user | 2 |
| root | 2 |
| batch_user | 1 |
+------------+-----+
SHOW PROCESSLIST;でも同じ情報を一覧形式で確認できるが、集計やソートをする場合はSQLで扱えるperformance_schema.processlistのほうが柔軟である。
同様の情報を持つinformation_schema.processlistは非推奨であり、将来のバージョンで削除される予定のため使わない。
残りの接続数を計算する
max_connectionsとThreads_connectedを組み合わせると、残りの接続数を計算できる。
mysql> SELECT
-> (SELECT VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'max_connections') AS max_connections,
-> (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Threads_connected') AS current_connections;
+------------------+----------------------+
| max_connections | current_connections |
+------------------+----------------------+
| 151 | 1 |
+------------------+----------------------+
接続数が上限に達すると、新規接続時にERROR 1040 (HY000): Too many connectionsエラーが発生する。
定期的に残りの接続数を確認し、アプリケーション側のコネクションプール設定や、ProxySQLなどのコネクションプーラーの導入を検討する。
参考
- MySQL Documentation: max_connections
- MySQL Documentation: Server Status Variables
- MySQL Documentation: SHOW PROCESSLIST Statement
