MySQLの接続数や接続サイズに関連するパラメータ

直近性能に関わる設計〜実装、テストまでを行ったので確認・更新した設定についてまとめる。
参考: [MySQL 8.0 Reference Manual  /  MySQL Server Administration  /  The MySQL Server  /  Server System Variables](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html)

## 各設定

### max_connections

#### 概要:
サーバーに同時に接続できるクライアントの最大数を設定するパラメータ。クライアント数が max_connections を超えると、新しい接続はエラーとなる。

実態のクライアント接続許可数は、設置値 + 1であり、管理者は常にクライアントアクセスの様子を確認できるようにしている。
最大有効値は、open_files_limit *1 の値 - 810と、実際にmax_connectionsに設定された値のうち、小さい方である。


*1: MySQLサーバーが同時に開けるファイルの最大数を定義するパラメータであり、ファイルハンドルの上限に関係する設定。
ファイルハンドルは、サーバーがファイル（例えばテーブル、ログ、インデックス）にアクセスするために使用するリソースであり、MySQLでは、各テーブルやログファイルが個別のファイルとして扱われ、同時に多くのファイルが開かれる。


#### 用途:

接続数が急増する可能性のあるアプリケーションやサービスで、このパラメータを増やす必要がある。ただし、メモリ使用量やCPU負荷が高まるため、インスタンスのリソースに見合った値とする。

 以下はmax_connectionの基本情報：

| Command-Line Format      | --max-connections=# |
|--------------------------|---------------------|
| **System Variable**       | max_connections     |
| **Scope**                 | Global              |
| **Dynamic**               | Yes                 |
| **SET_VAR Hint Applies**  | No                  |
| **Type**                  | Integer             |
| **Default Value**         | 151                 |
| **Minimum Value**         | 1                   |
| **Maximum Value**         | 100000              |

### max_user_connections

#### 概要:

1ユーザーが持てる最大接続数を制限するパラメータ。max_connections とは異なり、特定のユーザーの接続を制限する。
デフォルトは0が指定されており、0以外の数値が指定されると、その値が適用される。

#### 用途:
一部のユーザーがリソースを独占しないように制限を設ける場合に有効。

以下はmax_user_connectionsの基本情報:

| Command-Line Format      | --max-user-connections=# |
|--------------------------|--------------------------|
| **System Variable**       | max_user_connections     |
| **Scope**                 | Global, Session          |
| **Dynamic**               | Yes                      |
| **SET_VAR Hint Applies**  | No                       |
| **Type**                  | Integer                  |
| **Default Value**         | 0                        |
| **Minimum Value**         | 0                        |
| **Maximum Value**         | 4294967295               |

### wait_timeout
#### 概要

クライアント接続がアイドル状態になってから切断されるまでの時間を定義する。

#### 用途
長時間アイドル状態の接続が続くと、無駄な接続が保持され続けるので
早めに切断することで、max_connections に達するのを防ぐ。

以下はwait_timeoutの基本情報:

| Command-Line Format      | `--wait-timeout=#`        |
|--------------------------|---------------------------|
| **System Variable**       | `wait_timeout`            |
| **Scope**                 | Global, Session           |
| **Dynamic**               | Yes                       |
| **SET_VAR Hint Applies**  | No                        |
| **Type**                  | Integer                   |
| **Default Value**         | 28800                     |
| **Minimum Value**         | 1                         |
| **Maximum Value (Windows)** | 2147483                   |
| **Maximum Value (Other)** | 31536000                  |
| **Unit**                  | seconds                   |

### interactive_timeout
#### 概要:

対話的なクライアント接続に適用されるタイムアウト設定。
主に MySQLクライアントやターミナルから直接接続された対話的なセッションが対象。

#### 用途:
wait_timeoutと一緒。接続の方法が違うだけ。

以下はinteractive_timeoutの基本情報:

| Command-Line Format      | `--interactive-timeout=#`  |
|--------------------------|----------------------------|
| **System Variable**       | `interactive_timeout`      |
| **Scope**                 | Global, Session            |
| **Dynamic**               | Yes                        |
| **SET_VAR Hint Applies**  | No                         |
| **Type**                  | Integer                    |
| **Default Value**         | 28800                      |
| **Minimum Value**         | 1                          |
| **Maximum Value**         | 31536000                   |
| **Unit**                  | seconds                    |

### max_allowed_packet

#### 概要:

サーバーが一度に送受信できる最大パケットサイズを指定する。大きなデータ（例えば、BLOBや長い文字列）を扱う場合には、これを増やす必要がある。

#### 用途:

大量データの転送や、バッチ処理、バイナリデータの保存に必要なパラメータ。これが不足していると、クエリがエラーになる。
大きすぎると不正なリクエストのサイズも許容してしまうので注意が必要。

以下はmax_allowed_packetの基本情報:

| Command-Line Format      | `--max-allowed-packet=#`   |
|--------------------------|----------------------------|
| **System Variable**       | `max_allowed_packet`       |
| **Scope**                 | Global, Session            |
| **Dynamic**               | Yes                        |
| **SET_VAR Hint Applies**  | No                         |
| **Type**                  | Integer                    |
| **Default Value**         | 67108864                   |
| **Minimum Value**         | 1024                       |
| **Maximum Value**         | 1073741824                 |
| **Unit**                  | bytes                      |
| **Block Size**            | 1024                       |

### net_buffer_length

#### 概要:

初期のネットワークバッファサイズを定義する。MySQLがクエリを受信したときに最初に使用するバッファのサイズで、必要に応じてmax_allowed_packetまで自動的に増加する。

#### 用途:

大きなデータのクエリが発生しやすい場合に最初のバッファサイズを調整して、パフォーマンスを最適化する。

以下はnet_buffer_lengthの基本情報:

| Command-Line Format      | `--net-buffer-length=#`    |
|--------------------------|----------------------------|
| **System Variable**       | `net_buffer_length`        |
| **Scope**                 | Global, Session            |
| **Dynamic**               | Yes                        |
| **SET_VAR Hint Applies**  | No                         |
| **Type**                  | Integer                    |
| **Default Value**         | 16384                      |
| **Minimum Value**         | 1024                       |
| **Maximum Value**         | 1048576                    |
| **Unit**                  | bytes                      |
| **Block Size**            | 1024                       |

### thread_cache_size

#### 概要:

スレッドキャッシュのサイズを設定する。クライアント接続時に新しいスレッドを生成するのではなく、キャッシュされたスレッドを再利用することで接続処理のオーバーヘッドを減らす。

#### 用途:

高頻度で接続が発生する環境では、通常 thread_cache_size を十分に大きく設定し、ほとんどの新規接続がキャッシュされたスレッドを使用するようにする。

以下はthread_cache_sizeの基本情報:

| Command-Line Format      | `--thread-cache-size=#`    |
|--------------------------|----------------------------|
| **System Variable**       | `thread_cache_size`        |
| **Scope**                 | Global                    |
| **Dynamic**               | Yes                        |
| **SET_VAR Hint Applies**  | No                         |
| **Type**                  | Integer                    |
| **Default Value**         | -1 (autosizing)            |
| **Minimum Value**         | 0                          |
| **Maximum Value**         | 16384                      |

## 学び

必要な値まで上げれば良いと思っていたが、コストやセキュリティ上のリスクが増大してしまう。
設計によってそれぞれの要件を許容できるラインを見つけることが必要である。