4

私はデータベース初心者です。データベースのいくつかについて疑問に思っています。たとえば、Facebook が友人関係を保存する方法の構造を見ました ( https://developers.facebook.com/docs/reference/fql/friendを参照)。1 番目のユーザー ID と 2 番目のユーザー ID の 2 つの列しかありません。大丈夫です。

ウィキペディアによると、Facebook には約 10 億人のアクティブ ユーザーがいます。その友人関係テーブルには、おそらく約 1,000 億行あります。そのテーブルを検索するのは超高速です (例: 友達のリストを見る)。どうやってあのスピードでやるのか不思議です。

それは、Facebook に魔法のようなバックエンドがあるからでしょうか? それともデータベースの魔法ですか?PHP と MySQL を使用してそれを行うこともできますか (何百万ものユーザーがいて、数秒でデータベースを検索できます)。

(ばかげた質問をしているかもしれませんが、いつも気になります。答えを残してください)

4

3 に答える 3

2

データベースはインデックスを利用します。このようにして、特定のユーザー ID に関連するデータをすばやく見つけることができます。

インデックス構造、スペースの占有などに応じて...ゲインがあります。つまり、N列を検索する代わりに、-たとえば-を検索しますlog(N)。1000億行の二分法による検索

N = 100,000,000,000

だろう

Search(N) : search log2(N) = search (36 rows)

10^12 行を検索する代わりに、36 行のみを分析する必要があります。

あなたが言及した場合、友人、各ユーザーには複数の友人がいる可能性があるため、

user1 => (userX, userY, userZ, ...)
userX => (userU, userV, user1, ...)

つまり、user1 は userX、userY などと友達です。つまり、ユーザーごとに一意のインデックスがありません。しかし、数人のユーザーごとに一意のインデックスがあります。

Mysqlでそれは

UNIQUE(user1,user2)

つまり、カップル (user1,user2) はテーブル内で 1 回だけです。構文は次のようになります

CREATE UNIQUE INDEX friendsindex ON friends(user1,user2)

friendsindexはインデックス名、friendsはテーブルです。または、あなたが言ったように、テーブルの主キーを宣言します(user1,user2)(主キーはテーブルごとに一意です)。

--

特定のオブジェクトの正確な価格を見つけることからなるゲームに勝つための戦略は、同じ原則に基づいています。価格が 1 から 10000 の間であるとします。価格を伝えると、ハンドラーは+またはと言い-ます。できるだけ少ない試行で価格を見つける必要があります。たとえば、価格は 6000 です。

から開始し1てすべての価格を指定することもできます (つまり、6000 回の試行) が、二分法6000で進めることもできます。

  • あなた: 5000
  • ゲーマー: +
  • 7500 または (10000 - 5000)/2
  • -
  • 6250 または (7500 - 5000)/2
  • -
  • 等...

各反復で残りの範囲を 2 で除算します。6000 回の試行ではなく、12 回の試行で見つけることができます (log2(6000))。

--

対数について

たとえば、 で x を見つける方法は2^x = 1024? または、2 を底とする 1024 の対数をx = log2(1024)意味します (答え: 10)。この例では、バイナリ ツリーに基づくインデックスを持つ 1024 行のテーブルでは、適切な要素を見つけるために (最大 1024 回ではなく) 10 回 (最大) 試行する必要があります。

于 2013-02-03T16:42:18.237 に答える
1

パフォーマンスは、インデックス作成、キャッシング、およびシャーディングから得られる可能性があります。

于 2013-02-03T16:41:28.423 に答える
0

Facebook にはサーバー ファームがあります。彼らはクラスターか何かをセットアップして、SQLサーバーの同一のコピーをいくつか持っていると思います。これらの SQL データベースでは、検索を高速化するためにインデックスを使用しますが、ユーザー コンピューターでローカル キャッシュを使用することもできるため、結果を高速に取得できます。

于 2013-02-03T16:43:02.643 に答える