このトピックでは、AUTO モードデータベースと DRDS モードデータベースを紹介し、比較します。
PolarDB-X のデータベースモード
PolarDB-X 5.4.13 以降では、自動パーティショニングデータベースとも呼ばれる AUTO モードデータベースを作成できます。このモードは自動パーティショニングをサポートしており、テーブル作成時にパーティションキーを指定しなくても、データがクラスター全体に自動的かつ均等に分散されます。また、標準の MySQL パーティショニング構文を使用して、テーブルに手動でパーティショニングを実行することもできます。これにより、透過的分散、自動スケーリング、パーティション管理など、分散データベースの機能を容易に活用できます。
PolarDB-X 5.4.13 より前のバージョンのデータベースは DRDS モードデータベースです。このモードは自動パーティショニングをサポートしていません。テーブルを作成する際は、DRDS 固有のシャーディング構文を使用してシャーディングキーを指定する必要があります。指定しない場合は、非パーティションテーブルが作成されます。
PolarDB-X 5.4.13 以降では、AUTO モードデータベースと DRDS モードデータベースの両方をサポートします。これらは同一インスタンス内で共存できます。
注意事項
-
AUTO モードデータベースを作成するには、
CREATE DATABASE文でMODE='AUTO'を明示的に指定する必要があります。 -
CREATE DATABASE文で MODE パラメーターを省略した場合、PolarDB-X はデフォルトで DRDS モードデータベースを作成します。 -
AUTO モードデータベースでは、DRDS のシャーディング構文を使用してシャードテーブルを作成できません。作成できるのはパーティションテーブルのみです。
-
DRDS モードデータベースでは、パーティショニング構文を使用してパーティションテーブルを作成できません。作成できるのはシャードテーブルのみです。
-
Standard Edition クラスターでは、AUTO モードデータベースの作成はサポートされていません。
データベースモードの指定
PolarDB-X でデータベースを作成する際は、MODE パラメーターを使用してデータベースモードを指定します。
データベースの作成後にデータベースモードを変更することはできません。
|
パラメーター |
値 |
説明 |
データベース作成 |
テーブル作成 |
|
MODE |
'AUTO' |
AUTO モードデータベースを作成します。 |
例:
詳細については、「CREATE DATABASE」をご参照ください。 |
AUTO モードデータベースで作成されるテーブルは パーティションテーブル と呼ばれます。標準の MySQL 構文を使用します。詳細については、「MySQL partitioned table syntax」をご参照ください。 |
|
'DRDS' (デフォルト) 説明
MODE パラメーターを指定しない場合、デフォルトで DRDS モードデータベースが作成されます。 |
DRDS モードデータベースを作成します。 |
例:
詳細については、「CREATE DATABASE」をご参照ください。 |
DRDS モードデータベースで作成されるテーブルは シャードテーブル と呼ばれます。詳細については、「DRDS sharded table syntax」をご参照ください。 |
自動パーティショニングと手動パーティショニング
自動パーティショニング
自動パーティショニングでは、テーブル作成時に、パーティションキーやパーティショニングポリシーなどのパーティショニング定義を指定する必要はありません。PolarDB-X がパーティションキーを自動的に選択し、テーブルとそのインデックスを水平パーティショニングします。AUTO モードデータベースは自動パーティショニングをサポートしますが、DRDS モードデータベースはサポートしません。
次に例を示します。
標準の MySQL 構文を使用して、パーティショニング定義を指定せずに tb という名前のテーブルを作成します:
CREATE TABLE tb(a INT, b INT, PRIMARY KEY(a));
-
DRDS モードデータベースでは、この DDL 文により非パーティションテーブルが作成されます。
SHOW文を実行して、完全なテーブル作成文を確認します:SHOW FULL CREATE TABLE tb \G *************************** 1. row *************************** Table: tb Create Table: CREATE TABLE `tb` ( `a` int(11) NOT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 1 row in set (0.02 sec) -
AUTO モードデータベースでは、この DDL 文によりパーティションテーブルが作成されます。
SHOW文を実行して、完全なテーブル作成文を確認します:SHOW FULL CREATE TABLE tb \G *************************** 1. row *************************** TABLE: tb CREATE TABLE: CREATE PARTITION TABLE `tb` ( `a` int(11) NOT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 PARTITION BY KEY(`a`) PARTITIONS 16 1 row in set (0.01 sec)
PolarDB-X の自動パーティショニング機能により、アプリケーションは自動スケーリングやパーティション管理など、分散データベースの機能を容易に活用できます。
手動パーティショニング
手動パーティショニングでは、テーブル作成時に、パーティションキーやパーティショニングポリシーなどのパーティショニング定義を明示的に指定する必要があります。手動パーティショニングのテーブル作成構文は、AUTO モードデータベースと DRDS モードデータベースで異なります。
-
AUTO モードデータベース:標準の MySQL 構文を使用してパーティションテーブルを作成します。このモードは、HASH、RANGE、LIST など、複数のパーティショニングポリシーをサポートします。
次の例では、
PARTITION BY KEY(a)構文により、a列をパーティションキーとして指定し、tbテーブルのパーティショニングポリシーとして KEY を指定しています:CREATE TABLE tb (a INT, b INT, PRIMARY KEY(a)) -> PARTITION by KEY(a) PARTITIONS 4; Query OK, 0 rows affected (0.83 sec) SHOW FULL CREATE TABLE tb\G *************************** 1. row *************************** TABLE: tb CREATE TABLE: CREATE TABLE `tb` ( `a` int(11) NOT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 PARTITION BY KEY(`a`) PARTITIONS 4 1 row in set (0.02 sec) -
DRDS モードデータベース:DRDS 固有のシャーディング構文を使用してシャードテーブルを作成します。このモードは HASH ポリシーのみをサポートします。
次の例では、
DBPARTITION BY HASH(a) TBPARTITION BY HASH(a)構文により、a列をtbテーブルのシャーディングキーとして指定しています:CREATE TABLE tb (a INT, b INT, PRIMARY KEY(a)) -> DBPARTITION by HASH(a) -> TBPARTITION by HASH(a) -> TBPARTITIONS 4; Query OK, 0 rows affected (1.16 sec) SHOW FULL CREATE TABLE tb\G *************************** 1. row *************************** Table: tb Create Table: CREATE TABLE `tb` ( `a` int(11) NOT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`a`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`a`) tbpartition by hash(`a`) tbpartitions 4 1 row in set (0.02 sec)
ルーティングアルゴリズムの比較:パーティションテーブルとシャードテーブル
パーティションテーブルとシャードテーブルの主な違いは、ルーティングアルゴリズムです。
-
シャードテーブルのルーティングアルゴリズムは、ハッシュ値を物理テーブルシャード数で剰余演算します。シャード数を変更 (例:4 から 5) すると、すべてのデータを再ハッシュする必要があります。そのため、DRDS モードのシャードテーブルは、シャード数の変更をサポートしません。
-
パーティションテーブルのデフォルトのルーティングアルゴリズムは、レンジベースのコンシステントハッシュアルゴリズムです。このアルゴリズムは、すべてのデータを再ハッシュすることなく、分割やマージなどの操作によるパーティション変更をネイティブにサポートします。そのため、AUTO モードのパーティションテーブルは、パーティション単位の変更をサポートします。
機能比較
DRDS モードデータベースと比較して、AUTO モードデータベースは、自動パーティショニング、ホットデータの分割、パーティションスケジューリング、Time to Live (TTL) などの新機能を提供します。また、パーティション管理やパーティショニング方式の変更など、分散利用の体験を大幅に最適化します。
次の表で、AUTO モードデータベースと DRDS モードデータベースの主な機能を比較します。
|
機能 |
AUTO モード |
DRDS モード |
|
|
透過的分散 |
デフォルトの主キーパーティショニング |
サポートされています。テーブル作成時にパーティショニング方式を定義しない場合、PolarDB-X はテーブルを主キーで自動的にパーティショニングします。 |
サポートされていません。 |
|
デフォルトのグローバルセカンダリインデックス (GSI) |
サポートされています。インデックスに対してパーティショニング列が指定されていない場合、PolarDB-X はインデックス列で自動的にパーティショニングします。 |
サポートされていません。 |
|
|
負荷分散 |
サポートされています。 |
サポートされていません。 |
|
|
ホットデータ分散 |
サポートされています。 |
サポートされていません。 |
|
|
パーティショニングポリシー |
ハッシュパーティショニングおよびキーパーティショニング |
サポートされています。コンシステントハッシュアルゴリズムを使用し、ホットデータ分散をサポートします。 |
サポートされています。剰余ベースのルーティングアルゴリズムを使用しますが、ホットデータ分散はサポートしません。 |
|
レンジパーティショニングおよびレンジ列パーティショニング |
サポートされています (ホットデータ分散のサポートを含む)。 |
サポートされていません。 |
|
|
リストパーティショニングおよびリスト列パーティショニング |
サポートされています。 |
サポートされていません。 |
|
|
ベクトルパーティションキー |
サポートされています。パーティションキーはベクトルとして指定できます。例: |
サポートされていません。 |
|
|
パーティションキーの照合順序 |
サポートされています。 |
サポートされていません。 |
|
|
非パーティションテーブルとブロードキャストテーブル |
サポートされています。 |
サポートされています。 |
|
|
パーティション管理 |
パーティションの作成、削除、変更 |
サポートされています。 |
サポートされていません。 |
|
パーティションの分割とマージ |
サポートされています。 |
サポートされていません。 |
|
|
パーティション移行 |
サポートされています。 |
サポートされていません。 |
|
|
パーティションのトランケート |
サポートされています。 |
サポートされていません。 |
|
|
パーティションインサイト |
近日提供予定。この機能はホットパーティションの自動分析をサポートします。 |
サポートされていません。 |
|
|
パーティショニング方式の変更 |
テーブルタイプの変更 (非パーティションテーブル、ブロードキャストテーブル、パーティションテーブル間の変換) |
サポートされています。 |
サポートされています。 |
|
パーティション定義の変更 (パーティション数、パーティションキータイプ、パーティショニングポリシーを含む) |
サポートされています。 |
サポートされています。 |
|
|
自動スケーリング |
スケーリング中の書き込み停止 |
いいえ。 |
はい (短時間)。 |
|
他の DDL 操作を許可 |
はい。 |
いいえ。 |
|
|
Locality |
静的ストレージ分離 |
サポートされています。データベース、テーブル、パーティションの作成時に物理ストレージリソースを指定します。 |
サポートされています。データベースとテーブルの作成時に物理ストレージリソースを指定します。 |
|
動的ストレージ分離 |
サポートされています。データベースとテーブルの物理ストレージリソースを動的に調整します。 |
サポートされていません。 |
|
|
自動スケーリングとの互換性 |
はい。 |
いいえ。 |
|
|
パーティションプルーニング |
プレフィックスに基づくパーティションプルーニング |
サポートされています。 たとえば、 |
サポートされていません。 |
|
計算式における定数畳み込み |
サポートされています。 たとえば、 |
サポートされていません。パーティションキー条件は、 |
|
|
パーティションルーティングの大文字小文字の区別と末尾スペースの扱い |
サポートされています。 パーティションキーに照合順序を指定して、ルーティングで大文字小文字を区別するか、末尾スペースを無視するかを決定できます。 |
サポートされていません。パーティション列の照合順序はサポートされていません。HASH アルゴリズムは大文字小文字を区別し、末尾スペースを無視しません。 |
|
|
JOIN 操作のプッシュダウン |
サポートされています。 JOIN 操作のプッシュダウンは、分割、マージ、移行などのパーティション操作中も影響を受けません。 |
サポートされています。 |
|
|
パーティション選択 |
サポートされています。 パーティション選択構文を使用して、特定のパーティションをクエリできます。例: |
サポートされていません。 |
|
|
Time to Live (TTL) |
サポートされています。 |
サポートされていません。 |
|
|
AUTO_INCREMENT |
サポートされています。値がグローバルに一意であり、単調増加し、かつ連続することを保証します。 |
サポートされています。値がグローバルに一意であることは保証しますが、単調増加または連続することは保証しません。 |
|
パフォーマンス比較
DRDS モードのシャードテーブルと AUTO モードのパーティションテーブルは、異なるルーティングアルゴリズムを使用します。パフォーマンスの違いを評価するため、Sysbench を使用して PolarDB-X のベンチマークを実施しました。このテストでは、さまざまな Sysbench テストシナリオにおける各モードのスループット (1秒あたりのクエリ数、QPS) を測定します。
テスト環境
-
PolarDB-X インスタンス仕様:polarx.x4.2xlarge.2e
-
コンピューティングノード (CN):2 × (16 コア CPU、64 GB RAM)
-
データノード (DN):2 × (16 コア CPU、64 GB RAM)
-
-
バージョン:5.4.13-16415631
-
テーブル構成:
-
パーティションテーブル:
-
32 パーティション
-
パーティショニング構文:
partition by hash(id) partitions 32 -
テーブルデータ総数:1億6,000万行
-
-
シャードテーブル:
-
32 物理テーブルシャード
-
シャーディング構文:
dbpartition by hash(id) tbpartition by hash(id) tbpartitions 16 -
テーブルデータ総数:1億6,000万行
-
-
テストシナリオ
Sysbench テストでは、次のシナリオを使用します:
-
oltp_point_select:パーティションキーに対する等価条件を含むポイントセレクトクエリ。
-
oltp_read_only:パーティションキーに対するトランザクションのポイントセレクトと小さなレンジクエリ (例:BETWEEN を使用) を組み合わせたシナリオ。
-
oltp_read_write:パーティションキーに対するトランザクションのポイントセレクト、小さなレンジクエリ、および書き込みを組み合わせたシナリオ。
テスト結果
-
パーティションテーブルで使用されるコンシステントハッシュアルゴリズムは、シャードテーブルの剰余ベースのハッシュより複雑ですが、
oltp_point_selectシナリオのスループットはほぼ同一であり、顕著な性能低下は見られません。 -
複雑なレンジスキャンを含む
oltp_read_onlyおよびoltp_read_writeシナリオでは、パーティションテーブルは全体スループットが約 33% 高くなります。この改善は、AUTO モードで利用できる高度なパーティションプルーニング最適化によるものです。
よくある質問
-
Q1:AUTO モードと DRDS モードは、どのように選択すべきですか?
A:新規アプリケーションと、PolarDB-X 1.0 から移行したアプリケーションのいずれについても、AUTO モードの使用を推奨します。
-
Q2:AUTO モードでは、テーブル作成時に自動パーティショニングと手動パーティショニングのどちらを使用すべきですか?
A:テストフェーズでは、自動パーティショニングを使用できます。後でワークロードに合わせたパフォーマンスチューニングが必要だと判明した場合は、DDL 文 (例:
ALTER PARTITION文) を使用して、テーブルのパーティショニング方法を変更できます。ビジネス固有の SQL パターンやテーブル間の関係を深く理解している場合は、最初から手動パーティショニングを使用できます。 -
Q3:データベースを DRDS モードから AUTO モードに切り替えるにはどうすればよいですか?
A:カーネルバージョン 5.4.16 以降では、次のいずれかの方法を使用できます。5.4.16 より前のバージョンでは、方法 2 と方法 3 のみがサポートされます。インスタンスのバージョンを確認する方法については、「View the engine version」をご参照ください。
-
方法1:バージョン 5.4.16 以降では、カーネルで
CREATE DATABASE LIKE/AS構文が提供されています。これにより、1つのコマンドで DRDS モードデータベースを AUTO モードデータベースに変換できます。使用方法の詳細については、「Convert a DRDS mode database to an AUTO mode database」をご参照ください。 -
方法2:ターゲットインスタンスに新しい AUTO モードデータベースを作成し、必要なテーブルを定義します。その後、Data Transmission Service (DTS) を使用して、元の DRDS モードデータベースから新しい AUTO モードデータベースへデータを同期します。
-
方法3:
mysqldumpコマンドを使用して、元の DRDS モードデータベースからデータをダンプします (テーブル作成文は除外)。次に、新しい AUTO モードデータベースを作成してテーブルを定義し、sourceコマンドを使用してダンプしたデータファイルをインポートします。
-
-
Q4:AUTO モードの自動パーティショニングにおけるデフォルトのパーティション数はいくつですか?
A:自動パーティションのデフォルト数は、(インスタンス作成時のノード数) × 8 として計算されます。たとえば、インスタンスが 2 ノードで作成された場合、デフォルトのパーティション数は 2 × 8 = 16 です。この数はインスタンス作成後は一定で、対応するパラメーターを手動で調整しない限り、自動スケーリングの影響を受けません。
-
Q5:自動パーティションのデフォルト数を手動で調整できますか?
A:はい。デフォルトのパーティション数のパラメーターは AUTO_PARTITION_PARTITIONS で、インスタンスレベルのパラメーターです。そのため、このパラメーターを変更すると、そのインスタンス内の任意の AUTO モードデータベースで新規に作成されるすべてのテーブルの自動パーティション数に影響します。新しいテーブルのパーティション数が既存テーブルと異なる場合、それらの間の JOIN 操作のプッシュダウンが失敗し、クエリ効率に影響する可能性がある点に注意してください。必要に応じて、パーティション数は手動で調整することを推奨します。詳細については、「Modify table-level partitions (AUTO mode)」をご参照ください。