このトピックでは、STR_HASH関数の使用方法について説明します。
説明
STR_HASH関数を使用して、文字列の開始位置の添字と終了位置の添字を指定できます。 これにより、シャードキーの文字列値を部分文字列に切り捨てることができます。 次に、この部分文字列を文字列または整数として使用して、特定の物理データベースシャードとテーブルシャードのルートを計算します。 STR_HASH関数は次の構文を使用します。
STR_HASH( shardKey [, startIndex, endIndex [, valType [, randSeed ] ] ] )| パラメーター | 説明 |
| shardKey | シャードキー列の名前。 |
| startIndex | 部分文字列の開始位置の下付き文字。 元の文字列の文字の位置は0から始まります。 値0は、元の文字列の最初の文字を指定します。 デフォルト値の-1は、文字列が切り捨てられないことを指定します。 |
| endIndex | 部分文字列の末尾の位置添字。 元の文字列の文字の位置は0から始まります。 値0は、元の文字列の最初の文字を指定します。 デフォルト値の-1は、文字列が切り捨てられないことを指定します。 startIndexとendIndexを設定するときは、次の項目に注意してください。
|
| valType | データベースシャードとテーブルシャードのルートを計算するために使用される部分文字列の型。 有効な値:
|
| randSeed | 部分文字列が文字列として使用される場合にDRDSがルートのハッシュ値を計算するために使用するランダムシードの値。 この値は、STR_HASH関数がデフォルトのランダムシードを使用してデータを均等に分散できない場合にのみ使用されます。 デフォルト値は31です。 このパラメーターは、131、13131、1313131などの他の値に設定できます。 説明
|
注意
STR_HASH関数を使用して作成されたテーブルシャードは、ポイントクエリにのみ適しています。 テーブルシャードを範囲クエリに使用すると、テーブル全体のスキャンがトリガーされます。 これにより、クエリが遅くなります。
制限事項
- シャードキーはCHARまたはVARCHARタイプである必要があります。 シャードキーの値は文字列である必要があります。
- STR_HASH関数のパラメーターは、テーブルの作成後は変更できません。
- STRING型のシャードキーは、データルーティングが実行されるときに大文字と小文字が区別されます。
シナリオ
- STR_HASH関数は、各テーブルシャードまたはデータベースシャードがシャードキーの1つの値にのみ対応する正確なルーティングが必要なシナリオに適しています。 この値は文字列でなければなりません。 たとえば、インターネット金融アプリケーションは、YYYYMM関数を使用して、年と月ごとにデータをデータベースシャードに分割し、次に、注文IDごとにデータをテーブルシャードに分割します。 このアプリケーションでは、各注文IDの最後の3文字は、000から999の範囲の整数です。 このアプリケーションは、物理データベースシャード内の各注文IDの最後の3文字に関連するレコードを1つの物理テーブルシャードにルーティングするために必要です。 アプリケーションはYYYYMM関数を使用してデータをデータベースシャードに分割し、次にSTR_HASH関数を使用してデータをテーブルシャードに分割します。 アプリケーションの要件を満たすには、各データベースシャードに1,024テーブルシャードが含まれている必要があります。 次のSQL文を使用して、必要なシャードを作成できます。
create table test_str_hash_tb () id int NOT NULL AUTO_INCREMENT, order_id varchar (30) NOT NULL, create_time datetime DEFAULT NULL、 主キー (id) ) エンジン=InnoDBデフォルト料金=utf8 YYYYMMによるdbpartition ('create_time') tbpartition by STR_HASH('order_id', -1,3, 1) tbpartitions 1024;このSQL文は、各注文IDの最後の3文字を見つけ、000から999の範囲の整数に変換してから、モジュロ演算を実行してテーブルシャードを計算します。 テーブルシャードの総数は1,024です。 ルーティング結果は、各物理テーブルシャードがシャードキーの1つの値のみに対応することを保証します。 デフォルトでは、DRDSはシャーディングにHASH関数を使用します。 hashCode関数は文字列を一意ではない整数に変換する可能性があるため、デフォルトのシャーディング関数はこの効果を実現できません。 このように、1つの物理テーブルシャードは、シャードキーの複数の異なる値に対応し得る。
- STR_HASH関数は、文字列がシャードキーとして使用されるシナリオに適しています。 ほとんどの場合、この関数はポイントクエリの実行時に使用されます。 たとえば、この関数は、IDでトランザクション注文とロジスティクス注文をクエリする場合に使用できます。
例
- order_idで指定された文字列の最後の4文字は、データベースシャードとテーブルシャードのルートを計算するための整数として使用する必要があります。 この場合、次のSQL文
を実行できます。create table test_str_hash_tb () id int NOT NULL AUTO_INCREMENT, order_id varchar (32) NOT NULL, create_time datetime DEFAULT NULL、 主キー (id) ) エンジン=InnoDBデフォルト料金=utf8 STR_HASHによるdbpartition ('order_id', -1,4, 1) tbpartition by STR_HASH('order_id', -1,4, 1) tbpartitions 2; - order_idで指定された文字列の3番目の文字 (starIndex = 2) から7番目の文字 (endIndex = 7) までの文字は、データベースシャードとテーブルシャードのルートを計算するための部分文字列として使用する必要があります。 この場合、次のSQL文
を実行できます。create table test_str_hash_tb () id int NOT NULL AUTO_INCREMENT, order_id varchar (32) NOT NULL, create_time datetime DEFAULT NULL、 主キー (id) ) エンジン=InnoDBデフォルト料金=utf8 STR_HASHによるdbpartition ('order_id', 2, 7) tbpartition by STR_HASH('order_id ', 2,7) tbpartitions 2; - order_idで指定された文字列の最初の5文字は、データベースシャードとテーブルシャードのルートを計算するための部分文字列として使用する必要があります。 この場合、次のSQL文を実行してテーブルを作成できます。
create table test_str_hash_tb () id int NOT NULL AUTO_INCREMENT, order_id varchar (32) NOT NULL, create_time datetime DEFAULT NULL、 主キー (id) ) エンジン=InnoDBデフォルト料金=utf8 STR_HASHによるdbpartition ('order_id', 5, -1) tbpartition by STR_HASH('order_id ', 5, -1) tbpartitions 2;
よくある質問
dbpartition by STR_HASH(order_id) とdbpartition by HASH(order_id) の違いは何ですか?
STR_HASHとHASHは、文字列の値を使用してデータベースシャードとテーブルシャードのハッシュルートを計算しますが、異なるルートアルゴリズムを使用します。 STR_HASHでは、テーブルを作成するときに文字列を部分文字列に切り捨てることができます。 STR_HASHは、文字列のハッシュ値に基づいてデータベースシャードとテーブルシャードのルートを計算するときにもUNI_HASHアルゴリズムを使用します。 HASHは、単純なモジュロ演算を実行して、文字列のハッシュ値を取得する。