0

これらの mysql ストレージ メソッドのどれがクエリを実行するのが速いでしょうか (@anyid と言う特定のユーザーのフレンドを取得するには):

Table: Friends

Columns: friend1 friend2

友情ごとに1行だけ挿入し、次のようにクエリします

select friend1 
from FRIENDS 
where friend2=@anyid
UNION ALL
select friend2 
from FRIENDS 
where friend1=@anyid

また

フレンドシップごとに 2 つの行を挿入し (friend1 friend2 として挿入してから、1,2 と 2,1 などのスワップされたエントリを挿入します)、単純に次のようにクエリを実行します。

select friend2 from FRIENDS where friend1=@anyid

私には、2 番目の方法の方がパフォーマンスが優れているように思えます。これは、1 つの列の friend1 と 1 つのクエリに対してのみインデックスを作成する必要があるためです。最初の方法では、両方の列にインデックスを付ける必要があり、2 つのサブクエリを実行する必要があります。しかし、一部の投稿では、最初の方法の方がパフォーマンスが良いと主張する人がいます。プラス面では、最初の方法は2番目の方法と比較して半分のストレージを使用します。これは、たとえば100万件のレコードに大きな違いをもたらします.

また、もう1つ、上記の2つの方法のいずれかのために、別々relationship_idに保存する必要があります。creation_date人間関係を築く時間や順序を与えること以外に、私が得られる特別なメリットは何でしょうか? ほとんどの人はそれなしで生きていけるはずです?

回答ありがとうございます。

4

1 に答える 1

3

私にとっての基本的な質問は、「データベースにはいくつの友情があるか?」ということです。AとBだけが友達なら、数字は「1」か「2」です。この答えは、友情エンティティをどのように理解するか、したがってそれをどのように実装するかを決定します。

2つのアプローチには間違いなく違いがあります。最初の方法で友達の数を数えるには:

select count(*)
from friends
where USERID in (friend1, friend2);

対:

select count(*)
from friends
where USERID = friend1;

2 番目は、インデックスをより簡単に利用friend1でき、1 番目よりも高速になるように最適化できます。

一方、レコードの挿入には 2 倍の時間がかかります。また、友達の友達 (など) を見つけるには、より多くのデータを処理する必要があるため、処理時間が長くなります。

友情関係には、誰が要求を開始したかなどの追加の特徴があります (これは多くの場合friend1、最初のアプローチになります)。または、友情が要求され、受け入れられた回数。このような追加情報は、データの重複を排除するための最初のアプローチを示唆しています。

つまり、データ構造に関する質問は、ほとんどすべての質問と同様に、エンティティをどのように理解し、どのように使用するかによって答えられます。

于 2013-07-05T14:21:29.687 に答える