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

PolarDB:STR_HASH

最終更新日:Jun 05, 2024

このトピックでは、STR_HASH関数の使用方法について説明します。

説明

STR_HASH関数を使用して、文字列の開始位置の添字と終了位置の添字を指定できます。 これにより、シャードキーの文字列値を部分文字列に切り捨てることができます。 次に、この部分文字列を文字列または整数として使用して、特定の物理データベースシャードとテーブルシャードのルートを計算します。 STR_HASH関数は次の構文を使用します。

STR_HASH( shardKey [, startIndex, endIndex [, valType [, randSeed ] ] ] )
パラメーター説明
shardKeyシャードキー列の名前。
startIndex部分文字列の開始位置の下付き文字。 元の文字列の文字の位置は0から始まります。 値0は、元の文字列の最初の文字を指定します。 デフォルト値の-1は、文字列が切り捨てられないことを指定します。
endIndex部分文字列の末尾の位置添字。 元の文字列の文字の位置は0から始まります。 値0は、元の文字列の最初の文字を指定します。 デフォルト値の-1は、文字列が切り捨てられないことを指定します。
startIndexとendIndexを設定するときは、次の項目に注意してください。
  • startIndex == j&endIndex = k (j>=0, k>=0, k>j) の場合、元の文字列の [j, k) 範囲が部分文字列として使用されます。 次のリストは、範囲の例を示しています。
    • ABCDEFG文字列の場合、[1,5] 範囲の値はBCDEです。
    • ABCDEFG文字列の場合、[2,2] 範囲の値は ''です。
    • ABCDEFG文字列の場合、[4,100] 範囲の値はEFGです。
    • ABCDEFG文字列の場合、[100,105] 範囲の値は ''です。
  • startIndex == -1 && endIndex = k (k>=0) の場合、元の文字列の最後のk文字が部分文字列として使用されます。 元の文字列がk文字未満の場合、文字列全体が部分文字列として使用されます。
  • startIndex = k && endIndex == -1 (k>=0) の場合、元の文字列の最初のk文字が部分文字列として使用されます。 元の文字列がk文字未満の場合、文字列全体が部分文字列として使用されます。
  • startIndex == -1 && endIndex == -1の場合、元の文字列は切り捨てられません。 部分文字列は元の文字列と同じです。
valTypeデータベースシャードとテーブルシャードのルートを計算するために使用される部分文字列の型。 有効な値:
  • 0: 分散型リレーショナルデータベースサービス (DRDS) は、部分文字列を文字列として使用してルートを計算します。 この値がデフォルトです。
  • 1: DRDSはサブストリングを整数として使用してルートを計算します。 部分文字列の整数値は9223372036854775807を超えることはできません。
randSeed部分文字列が文字列として使用される場合にDRDSがルートのハッシュ値を計算するために使用するランダムシードの値。 この値は、STR_HASH関数がデフォルトのランダムシードを使用してデータを均等に分散できない場合にのみ使用されます。 デフォルト値は31です。 このパラメーターは、131、13131、1313131などの他の値に設定できます。
説明
  • このパラメーターは、valTypeが0に設定されている場合にのみ設定できます。
  • このパラメーターを設定した後、すべてのデータを手動でエクスポートし、新しいシャードアルゴリズムを使用してデータをインポートする必要があります。 このようにして、データは再配布される。

注意

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のデータ型はVARCHAR(32) です。 order_idをシャードキーとして使用して、データを4つのデータベースシャードと8つのテーブルシャードに分割します。
  • 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は、単純なモジュロ演算を実行して、文字列のハッシュ値を取得する。