Kristina ( Scaling MongoDBの作成者) は、ゲームを装って説明されたいくつかの戦略例を含むブログ投稿を書きました: How to Choose a Shard Key: The Card Game .
アプリケーションの要件とユース ケースに基づいて適切なシャード キーを選択するには、多くの考慮事項があります。
順序に関する一般的なアドバイスは{coarseLocality : 1, search : 1}
、読み取り用にデータの局所性を確保することです。
したがって、あなたの場合は、おそらく次のようになります{user_id:1,_id:1}
。
これにより、クエリを実行するときに同じデータの局所性が提供され、user_id
理想的には、一般的なクエリが単一のシャードからデータを取得できるようになります。
逆の順序は、より良い書き込み分散を提供する可能性があります ( _id がデフォルトのObjectIdのように単調に増加するキーではないことを前提としています) が、潜在的な欠点は信頼性です。読み取りクエリのデータがすべてのシャードに分散している場合、取得の問題が発生する可能性があります。 1 つのシャードがダウンしています。
私のアプリは常にuser_idとコレクションの最後のエントリで検索すると言っています。
user_id
一般的に を使用して(および使用せずに)検索する場合、_id
これはシャード キーとインデックスの最適化の選択にも影響します。最後のエントリを見つけるために、MongoDB は並べ替えを行う必要があります。すべてのシャードからデータを収集して並べ替えるのではなく、単一のシャードでその並べ替えを実行する必要があります。_id
たまたま日付ベースである場合、最後のエントリを見つけるためにシャード キーの一部として有益です。