データベースはインデックスを利用します。このようにして、特定のユーザー 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 回 (最大) 試行する必要があります。