コロケーション・テーブルと非コロケーション・テーブルにおけるプライマリキーの使用の違い
本記事は、The Distributed SQL Blog にて2023年1月26日に公開された “Differences in Primary Key Usage Between Colocated and Non-Colocated Tables” を翻訳および一部訳注を追加しております。最新情報は英語版の記事を参照してください。
YugabyteDBは、自動データシャーディングを備えた分散型SQLデータベースですが、テーブルとデータベースのコロケーションをサポートしています。これは、特定のユースケースをサポートするための便利な機能です。YugabyteDBのドキュメントページでは、コロケーションテーブルと、それが適しているユースケースについて説明しています。さらに、このブログポスト「Boosting Performance for Small Distributed SQL Data Sets with Colocated Tables」では、この機能が役立つ場合について簡潔な見解を示しています。
本記事では、コロケーションされたデータベース/テーブルとそうでないデータベース/テーブルのプライマリキーの違いについて説明します。これらの使用に関する構文解釈を深堀りする前に、上記のドキュメントやブログ記事を確認してこのトピックを理解することをお勧めします。
非コロケーション (分散) とコロケーションされたデータベース
非コロケーション/分散データベース
非コロケーション/分散データベースは、CREATE DATABASEコマンドを使用して作成します。このタイプのデータベースを定義するために、CREATE DATABASEコマンドに特別なオプションは必要ありません。
CREATE DATABASE my_noncolocated_db;
YugabyteDBクラスタの非コロケーション・データベースは、すべてのテーブルがクラスタ内のノードに分散しています。分散テーブルはデフォルトでハッシュ・シャーディングされ、プライマリキーの定義にはパーティションカラムとクラスタリングカラムが含まれます。パーティションカラムは、データが保存されるノードを決定するためのハッシュ関数で使用されるカラムです。クラスタリング・カラムは、同じハッシュ・キーを持つデータのソート順を決定するために使用されます。
レンジ・シャーディングも、分散テーブルに適用できます。これは、テーブルの行を連続した範囲に分割し、プライマリキーカラムの値に基づいてテーブルのソート順を決定するものです。
非コロケーション・データベースのプライマリキー構文
- 非コロケーション・データベースを以下のように作成します。
CREATE DATABASE my_noncolocated_db;
2. データベースに接続し、以下のクエリで非コロケーション・データベースかどうかを確認します。非コロケーション・データベースであれば、クエリは ’f’ の応答を返します。
SELECT yb_is_database_colocated();
3. 以下は、非コロケーション・テーブルのプライマリキー構文の例です。
- PRIMARY KEY (a, b, c) :カラム ‘a’ がパーティションカラムになります。シャーディングのためのハッシュ関数で使用されるのは ‘a’のみです。カラム’b’と’c’はクラスタリングカラムとなり、デフォルトで昇順でテーブルをソートします。
- PRIMARY KEY ((a, b, c)) :カラム ‘a’, ‘b’, ‘c’ が全てパーティションカラムになります。シャーディングのためのハッシュ関数には、内側の括弧内のカラム (つまりa, b ,c)が使用されます。
- PRIMARY KEY ((a, b), c)) :カラム ‘a’と’b’がパーティションカラムになります。シャーディングのためのハッシュ関数には、’a’と’b’が使用されます。
- PRIMARY KEY (a asc, b) :ハッシュ・シャーディングは行われません。データは’a’および’b’ による昇順で整理・分割されます。これがレンジ・シャーディングです。
コロケーションされたテーブルは、非コロケーション・データベースに作成することはできません。また、コロケーション・データベース内のテーブルは、テーブル作成時に非コロケーションを選択しない限り、コロケーションされます。
コロケーション・データベース
コロケーション・データベースは、CREATE DATABASEステートメントで WITH COLOCATED = ‘true’を使用して作成できます。
CREATE DATABASE my_colocated WITH colocated = 'true';
データベースがコロケーションとして定義されている場合、分散テーブルとコロケーションテーブルの両方のタイプのテーブルを持つことができます。
明示的に宣言されていない場合、コロケーション・データベースではすべてのテーブルがのコロケーションとして(つまり、テーブル全体がノード内の1つのタブレット上にある)作成されます。その結果、コロケーションテーブルにはハッシュシャーディングは適用されず、データは主キーで指定されたカラムとソート順で整理されます。ただし、耐障害性と可用性のために、すべてのテーブルのタブレットは、クラスタのレプリケーション係数に応じて他のノードにレプリケーションされます。
コロケーション・データベースに分散テーブルを作成することができます。これらのテーブルは、YugabyteDBのクラスタノードに分散され、デフォルトでハッシュでシャーディングされます。分散テーブルは、CREATE TABLEステートメントで明示的にWITH COLOCATED=’false’と指定することで作成されます。
CREATE TABLE my_noncolocated_table WITH (colocated = 'false');
分散テーブルとコロケーションテーブルの組み合わせによる柔軟性は、通常、いくつかの小さな参照中心の静的テーブルの中に、いくつかの大きなデータが増加するテーブルがある場合に必要となります。このようなテーブルを分散配置することで、テーブルの増加やテーブルの読み書きの要求に応じて、クラスタをスケールアウトすることが可能になります。
コロケーション・テーブルのプライマリキー構文
このセクションでは、コロケーション・データベースの作成方法に関する構文の詳細を説明します。また、コロケーションテーブルのプライマリキー構文の詳細と、それらを使用する必要があるアプリケーションにとっての意味も説明します。
- コロケーション・データベースは以下のように作成します。
CREATE DATABASE my_colocated_db WITH colocated = 'true';
2. データベースに接続し、以下のクエリで非コロケーション・データベースかどうかを確認します。非コロケーション・データベースであれば、クエリは ’t’ の応答を返します。
SELECT yb_is_database_colocated();
3. CREATE TABLEでのプライマリキー構文と、コロケーションDBでのその結果。以下のすべての構文シナリオでは、employeeという、int型のidとtext型のnameという2つのカラムを持つシンプルなテーブルを使用しています。
まとめ
YugabyteDBのコロケーションテーブルは、プライマリキーで指定されたカラムのソート順で整理され、1つのタブレットにのみ配置されます。そのため、PRIMARY KEY ((a, b, c)) のような構文で、複数のカラムを含むハッシュや内側の括弧を明示した場合、エラーとなります。
非コロケーションや分散テーブルは、デフォルトでハッシュ・シャーディングされます。また、用途に応じてレンジ・シャーディングされることもあります。
ハッシュシャーディングとレンジシャーディングの詳細については、当社のドキュメントサイトをご覧ください。