0

私は索引に入れたい単調に増加するフィールドを持つテーブルを持っています。しかし、ベストプラクティスguideでは、単調増加のデータをインターリーブされていないインデックスに入れないと言います。データをインターリーブされたインデックスに入れようとすると、親テーブルにインデックスをインターリーブできません。テーブル内の単調に増加するデータをインデックスする方法はありますか?

つまり、私はCloud SpannerをこのMySQLスキーマと同等にしたいと思います。

CREATE TABLE `my_table` (
    'id' bigint(20) unsigned NOT NULL, 
    'monotonically_increasing' int(10) unsigned DEFAULT '0', 
    PRIMARY KEY ('id'), 
    KEY 'index_name' ('monotonically_increasing') 
) 

答えて

3

単調に増加/減少する値を書き込むレートに依存します。

小さな書き込み負荷

あなたがホットスポットよ前に私はスパナサーバが処理できる毎秒の書き込みの正確な範囲を知らない(そしてそれはあなたのデータに依存)、しかし、あなたは< 500行を記述している場合毎秒あなたはこのパターンで大丈夫でしょう。書き込み負荷が、単独のSpannerサーバーがそれ自身で快適に処理できる場合よりも高い場合は、問題になります。

大きな書き込み負荷

あなたの書き込み速度は、(例えば、あなたのシステム/サイトの人気とスケールアップ)拡大、あるいは比較的制限がない場合は、代替案を検討する必要があります。これらの選択肢は、実際にどのユースケースを踏襲するかによって異なります。

一般的なアプローチの1つは、手動でインデックスを分割することです。たとえば、ピーク書き込み負荷が1秒あたり1740インサートになることがわかっているとします。以前からのサーバーあたり約500件の書き込みを使用すると、4台のSpannerサーバー(毎秒435回の書き込み)でこの負荷を破ることができれば、ホットスポットを避けることができます。

クラウドスパナのINT64タイプを使用すると、最大値は9,223,372,036,854,775,808になります。シャードする方法の1つは、それぞれの値にrandom(0,3)*1,000,000,000,000,000,000を追加することです。これにより、インデックスキーの範囲が4つのSpannerサーバーによって提供される4つの範囲に分割されます。下側は、x,000,000,000,000,000,000をマスキングした後、4つのクエリを実行してクライアント側で結果をマージする必要があります。

注:インターリーブは、ある表のデータ/索引が別の表の日付とインターリーブされている場合です。 1つのテーブルだけでインターリーブすることはできません。

関連する問題