アプリケーションのスケールアップに問題があり、ここで質問することにしました。
リレーショナルデータベース(たとえばmysql)について考えてみます。ユーザーが投稿を作成できるようにし、これらがpost
テーブルに保存されているとします(フィールドは:) postid, posterid, data, timestamp
。したがって、最新性で並べ替えてすべての投稿を取得する場合は、とを使用してすべての投稿を取得するだけposterid = you
ですorder by date
。十分に単純です。
このプロセスでは、カーディナリティが最も高いため、インデックスとしてタイムスタンプが使用されます。したがって、インデックスを調べるだけでなく、このタスクを完了するには、文字通りディスクから1行フェッチする必要があります。素晴らしい!
ただし、最後に投稿してから、他のユーザーによる(システム内の)投稿が100万回増えたとします。次に、最新の投稿を取得するために、データベースはタイムスタンプにインデックスを再度ペグしますが、それ以降に発生した投稿の数がわからない場合(または、少なくとも手動で優先キーを推定して設定する必要があります)?次に、1行をフェッチするためだけに、 100万行と1行を調べるのに無駄がありました。
さらに、複数の任意のユーザーからの一連の投稿がユースケースの1つになるため、userid_timestampのようなフィールドを作成してサブインデックスを作成することはできません。
私はこれを間違って見ていますか?または、そのような操作を少なくともある程度効率的に実行できるようにするために、アプリケーションから根本的に何を変更する必要がありますか?