Cloud Datastoreの日時範囲指定について

こんにちは。GMOアドマーケティングのH.Tと申します。
最近Cloud Datastoreを触った際日時範囲指定の必要があるスキーマ設計について
公式ドキュメントに記載のあるベストプラクティスを試したのでご紹介したいと思います。

Datastoreの概要


まず、Cloud Datastoreの簡単な紹介ですが以下の通りです。
公式ドキュメント[Datastore の概要]
Datastore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQL ドキュメント データベースです。
 

インデックスの注意事項

Cloud Datastoreの特徴は色々ありますがその一つに
Datastoreのデータをうまくシャーディングさせるためには連続した値を持つプロパティにインデックスを張ってはいけないという注意事項があります。
公式ドキュメント[Cloud Datastore のおすすめの方法>インデックス]
プロパティにインデックスを付ける際、単調に増加する値(NOW() タイムスタンプなど)を使用しないでください。このようなインデックスを使い続けると、ホットスポットが発生して、読み取りと書き込みを頻繁に行うアプリケーションでは Datastore モードのレイテンシに影響する可能性があります。
 

ベストプラクティスの実践

こちらを解消するためのベストプラクティスがドキュメントに記載されています。
公式ドキュメント[ベスト プラクティス>狭いキー範囲に高頻度で読み取りと書き込みを行わない]
単調に増加するキーまたはインデックス付きプロパティがある場合、それらの先頭にランダムなハッシュを付加すると、キーが確実に複数のタブレットにシャーディングされるようになります。
    例えば、以下のようなデータがあるとします。
id created_at
1 2022-03-01T00:00:00z
1 2022-03-01T00:00:01z
1 2022-03-01T00:00:02z
この場合idもcreated_atも単調に増加する値であるためインデックスを作成するとレイテンシが発生する恐れがあります。 これはダメ。。  
公式のベストプラクティス通りidをhash化してcreated_atのタイムスタンプに付加したプロパティを追加してみます。
id created_at hash_timestamp
1 2022-03-01T00:00:00z c4ca4238a0b923820dcc509a6f75849b1646092800
1 2022-03-01T00:00:01z c4ca4238a0b923820dcc509a6f75849b1646092801
1 2022-03-01T00:00:02z c4ca4238a0b923820dcc509a6f75849b1646092802
この時インデックスはhash_timestampのみに付与します。 上のSQLを実行したいときは以下のようにします。 これでidで絞りつつ日時も指定できるSQLを書くことができました。    

Cloud Datastoreについての所感


Cloud DatastoreはトランザクションのサポートやSQL ライクなクエリが書けるなど便利な反面 うまくスキーマ設計しないと色々な制約もあるので注意が必要だと思いました。
以上となります。ありがとうございます。