すべてのプロダクト
Search
ドキュメントセンター

PolarDB:パフォーマンス テスト レポート

最終更新日:Oct 14, 2025

このレポートでは、さまざまな暗号化シナリオにおける PolarDB-X 完全暗号化データベースのパフォーマンスについて詳しく説明します。この結果は、ニーズに合った適切な暗号化戦略を評価し、選択するのに役立ちます。

テスト結論のまとめ

テストディメンション

主な調査結果

全体のパフォーマンスオーバーヘッド

さまざまなインスタンスタイプと同時実行圧力の下で、100% の列暗号化 (テーブル内のすべての列を暗号化) を有効にした場合のパフォーマンスオーバーヘッドは、約 10% で安定しています。

ドライバーの置き換えによる影響

暗号化を行わない場合でも、標準の Java Database Connectivity (JDBC) ドライバーを EncJDBC ドライバーに置き換えると、クライアントの CPU 消費量が 30% から 50% 増加します。

クライアントのリソース消費

100% の列暗号化 (テーブル内のすべての列を暗号化) を有効にすると、最適なパフォーマンスを達成するために、クライアントの CPU 消費量がプレーンテキストのシナリオと比較して約 55% から 150% 増加します。

暗号化された列数の影響

パフォーマンスオーバーヘッドは、暗号化された列の数と正の相関があります。暗号化する列が多いほど、パフォーマンスオーバーヘッドが大きくなり、クライアントの CPU 消費量も高くなります。必要に応じて、機密性の高い列のみを暗号化してください。

テスト設計

テストモデルとメトリック

  • テストモデル: 業界標準の OLTP ベンチマークツールである Oltpbench とその TPC-C モデルを使用します。

  • データ量: テストは 1000 の TPC-C ウェアハウスに基づいており、コアの bmsql_order_line テーブルには 3 億行、bmsql_stock には 1 億行のデータがあります。

  • パフォーマンスメトリック: 1 秒あたりのトランザクション数 (TPS)。

説明

このレポートの結果は TPC-C の実装に基づいており、このテストはすべての TPC-C ベンチマーク要件を満たしていないため、公式に公開されている TPC-C ベンチマーク結果とは比較できません。

テスト環境

テストクライアント (ECS インスタンス) と PolarDB-X インスタンスは、ネットワーク遅延を最小限に抑えるために、同じ VPC とリージョンにデプロイされます。

構成

ECS インスタンス (クライアント)

PolarDB-X インスタンス (データベース)

リージョン

北京ゾーン I/H

北京ゾーン I/H

仕様

2 × ecs.c7.4xlarge (16 コア、32 GB)

2 × 4 コア、32 GB

4 × ecs.c7.4xlarge (16 コア、32 GB)

4 × 8 コア、64 GB

イメージ/バージョン

Alibaba Cloud Linux 3.2104 LTS 64 ビット

polardb-2.4.0_5.4.19-20240927_xcluster5.4.19-20241010

テストシナリオ

さまざまなレベルのデータ秘密度をシミュレートするために、テストでは暗号化された列のさまざまな割合をカバーしています:

  • 20% の列暗号化: ID や注文番号などの主要な識別子フィールドを暗号化します。

  • 50% の列暗号化: 20% のシナリオに加えて、価格、日付、数量などのビジネス情報を暗号化します。

  • 100% の列暗号化: すべてのテーブルのすべてのフィールドを暗号化します。

詳細なテスト結果

全体のパフォーマンス (100% 列暗号化 vs. プレーンテキスト)

すべての列を暗号化した場合、パフォーマンス (TPS) の低下はプレーンテキストと比較して一貫して約 10% です。

テスト結果

  • 2 × (4 コア、32 GB)

    同時実行数

    プレーンテキスト TPS

    100% 暗号化 TPS

    パフォーマンスオーバーヘッド

    64

    80,223

    72,248

    10%

    128

    99,019

    88,469

    11%

    256

    105,309

    94,756

    10%

    512

    104,313

    95,962

    8%

    1024

    98,990

    95,182

    4%

  • 4 × (8 コア、64 GB)

    同時実行数

    プレーンテキスト TPS

    100% 暗号化 TPS

    パフォーマンスオーバーヘッド

    64

    108,581

    96,828

    11%

    128

    184,293

    167,380

    9%

    256

    263,538

    239,913

    9%

    512

    292,481

    252,741

    13%

    1024

    284,561

    252,432

    11%

EncJDBC ドライバーのオーバーヘッド (プレーンテキストテスト)

EncJDBC ドライバーを使用すると、暗号化を行わなくても、クライアント側で CPU オーバーヘッドが発生します。

テスト条件

クライアントインスタンスタイプ (ECS インスタンス) は ecs.c7.4xlarge (16 コア、32 GB) で、同時実行数は 1024 です。

テスト結果

仕様

CPU 使用率

メモリ使用量 (MB)

標準 JDBC

EncJDBC

標準 JDBC

EncJDBC

2 × 4 コア、32 GB

21.37%

28.00%

+31%

1077

1001

-7.06%

4 × 8 コア、64 GB

47.09%

69.90%

+48%

1048

1024

-2.29%

暗号化有効後のクライアントリソース消費

100% の列暗号化を有効にすると、クライアント側の CPU 使用率が大幅に増加します。このオーバーヘッドを処理するために、アプリケーションに十分な CPU リソースがあることを確認してください。

テスト条件

同時実行数は 1024 です。

テスト結果

仕様

CPU 使用率 (暗号化前)

CPU 使用率 (100% 暗号化)

CPU 増加率

2 × (4 コア、32 GB)

13.01%

33.45%

+157%

4 × (4 コア、32 GB)

20.60%

32.07%

+56%

2 × (8 コア、64 GB)

19.93%

36.77%

+85%

4 × (8 コア、64 GB)

17.73%

43.59%

+146%

結論

完全な暗号化を有効にすると、クライアント側の CPU 消費量が 56% から 157% 増加し、最大で 1.5 倍以上増加します。

さまざまな暗号化率がパフォーマンスとリソースに与える影響

暗号化された列の数は、パフォーマンスとクライアントの CPU 消費に直接影響します。以下の表は、暗号化された列の割合が増加するにつれて、パフォーマンスオーバーヘッドとクライアントの CPU 使用率がどのように変化するかを示しています。

テスト条件

同時実行数は 1024 です。

テスト結果

  • 2 × (4 コア、32 GB)

    暗号化率

    クライアント CPU 使用率

    TPS

    パフォーマンスオーバーヘッド

    20%

    20.01%

    96,792

    2%

    50%

    22.23%

    96,639

    2%

    100%

    33.45%

    95,182

    4%

  • 4 × (8 コア、64 GB)

    暗号化率

    クライアント CPU 使用率

    TPS

    パフォーマンスオーバーヘッド

    20%

    22.50%

    276,640

    3%

    50%

    28.80%

    276,640

    8%

    100%

    43.59%

    276,640

    11%

結論

セキュリティとパフォーマンスの最適なバランスを達成するために、必要な機密データ列のみを暗号化することをお勧めします。

付録: テスト手順

ステップ 1: ECS クライアントの準備

ECS インスタンスを準備します。この ECS インスタンスは、データのインポートやテストの実行など、後続の操作に使用されます。

説明
  • ECS インスタンスに推奨されるアーキテクチャとオペレーティングシステム:

    • x86:

      • CentOS 7.9 以降。

      • Alibaba Cloud Linux 3。

      • Ubuntu 18.0 以降。

    • ARM: CentOS 8.0 以降。

  • テストに使用する ECS インスタンスを VPC にデプロイします。後続のすべてのインスタンスがこの VPC にデプロイされるため、この VPC の名前と ID をメモしておきます。

  • テストツールを操作するために、ECS インスタンスのパブリック IP アドレスを公開します。

ステップ 2: PolarDB-X インスタンスの準備

  1. PolarDB-X インスタンスを作成します

    説明

    PolarDB-X インスタンスを作成するときは、ECS インスタンスと同じ VPC にデプロイします。

  2. ECS インスタンスの内部 IP アドレスを PolarDB-X インスタンスのホワイトリストに追加します。

  3. インスタンスで、データベースを作成します。この例では tpcc_1000 を使用します。

    CREATE DATABASE tpcc_1000 MODE = 'auto';

ステップ 3: ベンチマークデータの準備

  1. テストツールの準備

    1. ECS インスタンスで、テストツールパッケージ benchmarksql.tar.gz をダウンロードして解凍します。

      tar xzvf benchmarksql.tar.gz
    2. 常時暗号化ドライバーパッケージ aliyun-encdb-mysql-jdbc-1.0.9-2-20240910.094626-1.jar をダウンロードし、benchmarksql/lib フォルダに移動します。

  2. テストパラメーターの構成

    1. benchmarksql/run フォルダに移動し、props.mysql 構成ファイルを編集します。

      cd benchmarksql/run
      vi props.mysql
    2. ご使用の環境に合わせて構成を変更します。以下は構成例と主要なパラメーターの説明です:

      db=mysql
      driver=com.aliyun.encdb.mysql.jdbc.EncDriver
      conn=jdbc:mysql:encdb://{HOST}:{PORT}/tpcc_1000_enc?/MEK={MEK}&ENC_ALGO={ENC_ALGO}&useSSL=false&useServerPrepStmts=false&useConfigs=maxPerformance&rewriteBatchedStatements=true
      user={USER}
      password={PASSWORD}
      
      warehouses=1000
      loadWorkers=100
      
      terminals=128
      // 端末ごとに指定されたトランザクションを実行するには、runMins を 0 にする必要があります
      runTxnsPerTerminal=0
      // 指定された分数だけ実行するには、runTxnsPerTerminal を 0 にする必要があります
      runMins=5
      // 1 分あたりの合計トランザクション数
      limitTxnsPerMin=0
      
      // 4.x 互換モードで実行するには true に設定します。構成されたデータベース全体を均等に使用するには false に設定します。
      terminalWarehouseFixed=true
      
      // 以下の 5 つの値の合計は 100 になる必要があります
      // 45, 43, 4, 4, 4 のデフォルトのパーセンテージは TPC-C 仕様に一致します
      newOrderWeight=45
      paymentWeight=43
      orderStatusWeight=4
      deliveryWeight=4
      stockLevelWeight=4
      
      // 詳細な結果データを収集するために作成するディレクトリ名。
      // これをコメントアウトすると抑制されます。
      resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
      
      // osCollectorScript=./misc/os_collector_linux.py
      // osCollectorInterval=1
      // osCollectorSSHAddr=user@dbhost
      // osCollectorDevices=net_eth0 blk_sda

      パラメーターの説明

      • conn: データベース接続文字列。{HOST}{PORT} を置き換えます。

      • {MEK}: マスター暗号化キー (MEK)。32 文字の 16 進数文字列です。

      • {ENC_ALGO}: 対称暗号化アルゴリズム。例: SM4_128_GCM

      • user: データベースのユーザー名。

      • password: データベースのパスワード。

      • warehouses: TPC-C ウェアハウスの数。これにより、総データ量が決まります。

      • loadWorkers: データインポート用の同時実行スレッド数。

      • terminals: テスト用の同時実行スレッド数。

      • runMins: テストの実行時間 (分)。

  3. データのインポートbenchmarksql/run フォルダで、次のコマンドを実行してデータのインポートを開始します。

    cd benchmarksql/run/sql.common
    cp tableCreates.sql.auto  tableCreates.sql
    cd ..
    nohup ./runDatabaseBuild.sh props.mysql &
  4. データ整合性の認証データがインポートされた後、コマンドラインから PolarDB-X インスタンスに接続し、次の SQL 文を実行してデータ整合性を検証します。すべてのクエリが空の結果セットを返した場合、データは正常にインポートされ、完全です。

    SELECT a.* FROM (SELECT w_id, w_ytd FROM bmsql_warehouse) a LEFT JOIN (SELECT d_w_id, sum(d_ytd) AS d_ytd_sum FROM bmsql_district GROUP BY d_w_id) b ON a.w_id = b.d_w_id AND a.w_ytd = b.d_ytd_sum WHERE b.d_w_id IS NULL;
    
    SELECT a.* FROM (SELECT d_w_id, d_id, D_NEXT_O_ID - 1 AS d_n_o_id FROM bmsql_district) a LEFT JOIN (SELECT o_w_id, o_d_id, max(o_id) AS o_id_max FROM bmsql_oorder GROUP BY  o_w_id, o_d_id) b ON a.d_w_id = b.o_w_id AND a.d_id = b.o_d_id AND a.d_n_o_id = b.o_id_max WHERE b.o_w_id IS NULL;
    
    SELECT a.* FROM (SELECT d_w_id, d_id, D_NEXT_O_ID - 1 AS d_n_o_id FROM bmsql_district) a LEFT JOIN (SELECT no_w_id, no_d_id, max(no_o_id) AS no_id_max FROM bmsql_new_order GROUP BY no_w_id, no_d_id) b ON a.d_w_id = b.no_w_id AND a.d_id = b.no_d_id AND a.d_n_o_id = b.no_id_max WHERE b.no_id_max IS NULL; 
    
    SELECT * FROM (SELECT (count(no_o_id)-(max(no_o_id)-min(no_o_id)+1)) AS diff FROM bmsql_new_order GROUP BY no_w_id, no_d_id) a WHERE diff != 0;
    
    SELECT a.* FROM (SELECT o_w_id, o_d_id, sum(o_ol_cnt) AS o_ol_cnt_cnt FROM bmsql_oorder  GROUP BY o_w_id, o_d_id) a LEFT JOIN (SELECT ol_w_id, ol_d_id, count(ol_o_id) AS ol_o_id_cnt FROM bmsql_order_line GROUP BY ol_w_id, ol_d_id) b ON a.o_w_id = b.ol_w_id AND a.o_d_id = b.ol_d_id AND a.o_ol_cnt_cnt = b.ol_o_id_cnt WHERE b.ol_w_id IS NULL;
    
    SELECT a.* FROM (SELECT d_w_id, sum(d_ytd) AS d_ytd_sum FROM bmsql_district GROUP BY d_w_id) a LEFT JOIN (SELECT w_id, w_ytd FROM bmsql_warehouse) b ON a.d_w_id = b.w_id AND a.d_ytd_sum = b.w_ytd WHERE b.w_id IS NULL;

ステップ 4: テストの実行

benchmarksql/run フォルダで、次のコマンドを実行して TPC-C テストを実行します。ターミナルには、1 分あたりのライブトランザクション数 (tpmC) が表示され、テスト完了後に最終的な平均値が出力されます。

cd benchmarksql/run
./runBenchmark.sh props.mysql