1

私はソーシャル ネットワークのようなサービスを構築しており、何兆ものユーザーを引き付けることが期待されています。これらのユーザーは、他のユーザーをフォローできます。たとえば、私が Facebook を構築しているとしましょう。ハッ!

各ユーザーの名前の横に、そのユーザーのフォロワー数が表示されます。何かのようなもの

SELECT COUNT(*) FROM users_vs_users 
  WHERE user_followed_id = 'xxx' GROUP BY user_followed;

動作しますが、ページをリロードするたびにそれを行い、何兆ものユーザーをチェックすると、サーバーが停止します。

誰かがフォローまたはフォロー解除されるたびに更新される、各ユーザーnum_of_followersのテーブルに名前が付けられたフィールドを持つことは合理的ですか?users

ありがとう

4

3 に答える 3

2

はい。事実上、パフォーマンス上の理由で非正規化しています。

于 2012-10-22T09:07:33.950 に答える
2

ここで別の意見があります

一部のデータベースは、Oracle times ten や MySQL Cluster などのメモリ (およびディスク同期) を使用できます。

頻繁にアクセスされるデータにのみメモリベースのデータベースを使用すると、通常は優れたパフォーマンスが得られ、「カウント」フィールドの履歴を管理する手間がかかります

もう 1 つの大きなヒントは、必要がない限り最適化しないことです。数年ではなく、今後数か月間で予想されるトラフィックを予測してみてください。そうすれば、どのクエリが実際にパフォーマンスを低下させているか、またはディスク アクセスが多すぎるかを監視できます。推測ではなく現実的な情報に従ってテーブルを非正規化する

于 2012-10-22T09:18:06.650 に答える
1

私の意見では、自尊心のある DBMS は、そのような最適化を内部的に独自に実行する必要があります。それとも、彼らはすでにそうしていますか?COUNT(*) は実際に遅いですか? 知らない。

とにかく、なぜですか?「users_vs_users」と「users.num_of_followers」が常に同期されていることを確認してください。

于 2012-10-22T09:08:06.930 に答える