## モジュール 1: 大量のスキーマとテーブルの迅速な作成

SaaS アプリケーションでは、異なるテナントに対して個別のスキーマやテーブルを提供することがよくあります。TiDB のスケーラビリティと効率的なメタデータ管理により、パフォーマンスと安定性を維持しながら、数千のスキーマとテーブルを迅速に作成することができます。

このモジュールでは、1,000 のスキーマを作成し、各スキーマに 10 のテーブルを含める、合計 10,000 テーブルの作成を試みます。

実際の環境では、問題なく 100 万テーブルまでスケールアップできます。今回は時間の制約により、生成を 1 万テーブルに制限します。

### 手順 1. TiUP コントロールマシンノードに接続する

+ ここをクリック - [ターミナル 1](ssh://monitor1-ssh#1) で、ハンズオン演習用に割り当てられた仮想マシンに接続された新しいターミナルを開きます。

### 手順 2. TiDB クラスターの状態を確認する

+ クラスターの状態を取得します。

  ```bash
  tiup cluster display tidb-demo
  ```

  ```output
  Cluster type:       tidb
  Cluster name:       tidb-demo
  Cluster version:    v${LAB:TIDB_VERSION}
  Deploy user:        ec2-user
  SSH type:          builtin
  Dashboard URL:      http://54.188.180.4:2379/dashboard
  Grafana URL:        http://10.90.4.196:3000
  ID                 Role          Host         Ports        OS/Arch       Status  Data Dir                      Deploy Dir
  --                 ----          ----         -----        -------       ------  --------                      ----------
  10.90.4.196:9093   alertmanager  10.90.4.196  9093/9094    linux/x86_64  Up      /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
  10.90.4.196:3000   grafana       10.90.4.196  3000         linux/x86_64  Up      -                             /tidb-deploy/grafana-3000
  10.90.2.26:2379    pd            10.90.2.26   2379/2380    linux/x86_64  Up|L    /tidb-data/pd-2379            /tidb-deploy/pd-2379
  10.90.4.196:9090   prometheus    10.90.4.196  9090/12020   linux/x86_64  Up      /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
  10.90.1.149:4000   tidb          10.90.1.149  4000/10080   linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
  10.90.3.216:20160  tikv          10.90.3.216  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.3.225:20160  tikv          10.90.3.225  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  10.90.3.95:20160   tikv          10.90.3.95   20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  Total nodes: 8
  ```

### 手順 3. 大量のテーブル使用に必要な 2 つの変数を有効にする

+ データベースユーザー `root` として TiDB サーバーインスタンスに接続します。

  ```bash
  mysql --prompt="mysql [\d] > " -h ${HOST_DB1_PRIVATE_IP} -P 4000 -u root
  ```

  ```output
  mysql [(none)] >
  ```

+ テーブル作成高速化変数 `tidb_enable_fast_create_table` を確認します。`v8.5` 以降のデフォルト値は `ON` です。v8.4.0 以前のバージョンからアップグレードしたクラスターの場合、デフォルト値は `OFF` のままです。

  ```sql
  show variables like 'tidb_enable_fast_create_table';
  ```

  ```output
  +-------------------------------+-------+
  | Variable_name                 | Value |
  +-------------------------------+-------+
  | tidb_enable_fast_create_table | ON    |
  +-------------------------------+-------+
  1 row in set (0.00 sec)
  ```

+ スキーマキャッシュサイズ変数 `tidb_schema_cache_size` を確認します。単一クラスター内のテーブル数が 10 万を超える場合、Infoschema v2 Cache Operation メトリクスを監視し、キャッシュサイズの値（デフォルトは 512MB）を調整してキャッシュヒット率を 85% 以上に維持します。grafana にアクセスして、`TiDB` -> `Schema Load` -> `Infoschema v2 Cache Operation` & `Infoschema v2 Cache Size` のパスでメトリクスを確認できます。

  ```sql
  show variables like 'tidb_schema_cache_size';
  ```

  ```output
  +------------------------+-----------+
  | Variable_name          | Value     |
  +------------------------+-----------+
  | tidb_schema_cache_size | 536870912 |
  +------------------------+-----------+
  1 row in set (0.00 sec)
  ```

  ```sql
  EXIT;
  ```

  ```output
  mysql> EXIT;
  ```

### 手順 4. sysbench の設定を準備する

+ sysbench ツールを取得します。このモジュールでは、sysbench を使用してデータベースとテーブルを並列に作成します。

  ```bash
  git clone https://github.com/lilinghai/sysbench/
  ```

  ```output
  Cloning into 'sysbench'...
  remote: Enumerating objects: 10789, done.
  remote: Counting objects: 100% (271/271), done.
  remote: Compressing objects: 100% (172/172), done.
  remote: Total 10789 (delta 119), reused 107 (delta 94), pack-reused 10518 (from 4)
  Receiving objects: 100% (10789/10789), 5.37 MiB | 29.74 MiB/s, done.
  Resolving deltas: 100% (7534/7534), done.
  ```

+ `sysbench` の設定をセットアップします。このハンズオン演習では 64 スレッドを使用します。

  ```bash
  cat << EOF > sysbench_config
  mysql-host=${HOST_DB1_PRIVATE_IP}
  mysql-port=4000
  mysql-user=root
  mysql-password=
  mysql-db=test
  time=60
  threads=64
  report-interval=1
  EOF
  cat sysbench_config
  ```

  ```output
  mysql-host=10.90.1.125
  mysql-port=4000
  mysql-user=root
  mysql-password=
  mysql-db=test
  time=60
  threads=64
  report-interval=1
  ```

### 手順 5. sysbench を使用して 10,000 テーブルを作成する

+ 1000 のデータベースを作成し、各データベースに 10 のテーブルを作成します。各テーブルには 100 の初期行があります。これは、SaaS アプリケーションが初期化される時点をシミュレートするために使用されます。多くのデータベースとテーブルを作成し、各スキーマは各テナントを表します。約 2 分かかりますが、演習の TiDB クラスターではマイクロインスタンスを使用しており、これは本番環境相当の環境ではないことに注意してください。

+ 実際の本番環境では、同じ速度で数百万のテーブルを作成できます。

  ```bash
  cd ~/sysbench/workloads/many_db_tables/
  sysbench oltp_read_write preparedb \
    --config-file=/home/ec2-user/sysbench_config --db_prefix=sbtest --dbs=1000 --tables=10 --table_size=100
  sysbench oltp_read_write preparetable \
    --config-file=/home/ec2-user/sysbench_config --db_prefix=sbtest --dbs=1000 --tables=10 --table_size=100
  sysbench oltp_read_write preparedata \
    --config-file=/home/ec2-user/sysbench_config --db_prefix=sbtest --dbs=1000 --tables=10 --table_size=100
  cd ~
  ```

  ```output
  sysbench 1.0.17 (using bundled LuaJIT 2.1.0-beta2)

  Initializing worker threads...
  ...
  Creating database 'sbtest15'...
  Creating database 'sbtest3'...
  Creating database 'sbtest10'...
  Creating database 'sbtest5'...
  ...
  Creating table sbtest2.sbtest2 ...
  Creating table sbtest6.sbtest2 ...
  Creating table sbtest7.sbtest2 ...
  Creating table sbtest5.sbtest2 ...
  Creating table sbtest1.sbtest2 ...
  Creating table sbtest2.sbtest1 ...
  Creating table sbtest8.sbtest1 ...
  Creating table sbtest1.sbtest1 ...
  Creating table sbtest6.sbtest1 ...
  Creating table sbtest7.sbtest1 ...
  Creating table sbtest4.sbtest2 ...
  ...
  Inserting 100 records into 'sbtest1.sbtest2'
  Inserting 100 records into 'sbtest1.sbtest1'
  Inserting 100 records into 'sbtest1.sbtest7'
  Inserting 100 records into 'sbtest1.sbtest3'
  Inserting 100 records into 'sbtest1.sbtest6'
  ...
  ```

### 手順 6. 作成したスキーマを確認する

+ データベースユーザー `root` として TiDB サーバーインスタンスに接続します。

  ```bash
  mysql --prompt="mysql [\d] > " -h ${HOST_DB1_PRIVATE_IP} -P 4000 -u root
  ```

  ```output
  mysql [(none)] >
  ```

+ スキーマを確認します。

  ```sql
  SHOW DATABASES;
  ```

  ```output
  +--------------------+
  | Database           |
  +--------------------+
  | INFORMATION_SCHEMA |
  | METRICS_SCHEMA     |
  | PERFORMANCE_SCHEMA |
  | mysql              |
  | sbtest1            |
  | sbtest10           |
  ...
  | sbtest987          |
  | sbtest988          |
  | sbtest989          |
  | sbtest99           |
  | sbtest990          |
  | sbtest991          |
  | sbtest992          |
  | sbtest993          |
  | sbtest994          |
  | sbtest995          |
  | sbtest996          |
  | sbtest997          |
  | sbtest998          |
  | sbtest999          |
  | sys                |
  | test               |
  +--------------------+
  1006 rows in set (0.00 sec)
  ```

+ テーブルを確認し、`sbtest1000` スキーマの任意のテーブルの行数を確認します。

  ```sql
  USE sbtest1000;
  SHOW TABLES;
  SELECT COUNT(1) FROM sbtest10;
  ```

  ```output
  Database changed
  +----------------------+
  | Tables_in_sbtest1000 |
  +----------------------+
  | sbtest1              |
  | sbtest10             |
  | sbtest2              |
  | sbtest3              |
  | sbtest4              |
  | sbtest5              |
  | sbtest6              |
  | sbtest7              |
  | sbtest8              |
  | sbtest9              |
  +----------------------+
  10 rows in set (0.00 sec)
  ...
  +----------+
  | count(1) |
  +----------+
  |      100 |
  +----------+
  1 row in set (0.00 sec)
  ```

+ 新しいテナントが SaaS アプリケーションの利用を始める際、TiDB ではメタデータの作成と初期データの投入が非常に高速です。
+ mysql クライアントを TiDB に接続したまま、次のモジュールに進みます。
