6

これはおそらく一般的な状況ですが、SOまたはGoogleで具体的な答えを見つけることができませんでした。

MySQLデータベースに友人関係の大きなテーブル(> 1000万行)があります。これは非常に重要であり、重複する行がないように維持する必要があります。このテーブルには、ユーザーのuidが格納されます。テーブルのSQLは次のとおりです。

CREATE TABLE possiblefriends(
 id INT NOT NULL AUTO_INCREMENT, 
 PRIMARY KEY(id),
 user INT, 
 possiblefriend INT)

テーブルが機能する方法は、各ユーザーが発見されて保存される必要がある約1000程度の「可能性のある友人」を持っているということですが、重複する「可能性のある友人」は避ける必要があります。

問題は、プログラムの設計により、1日の間に、重複する行エントリであるかどうかに関係なく、100万行以上をテーブルに追加する必要があることです。簡単な答えは、各行をチェックして重複しているかどうかを確認し、重複していない場合はテーブルに挿入することです。ただし、テーブルのサイズが1億行、10億行以上に増えると、この手法はおそらく非常に遅くなります(すぐにそうなると思います)。

このユニークなテーブルを維持するための最良の(つまり最速の)方法は何ですか?

常に一意の値のみを持つテーブルを用意する必要はありません。バッチジョブには1日1回必要です。この場合、可能なすべての行(重複する行とすべてを含む)を挿入するだけの別のテーブルを作成し、1日の終わりに、最初のテーブルのすべての一意の行を計算する2番目のテーブルを作成する必要がありますか?

そうでない場合、このテーブルを長期的に使用するための最良の方法は何ですか?

(インデックスが長期的な解決策として最適な場合は、使用するインデックスを教えてください)

4

2 に答える 2

8
于 2010-11-11T08:29:19.190 に答える
2

一意のインデックスを使用すると、フィールドが実際に一意であることを確認できます。次のように一意のインデックスを追加できます。

CREATE TABLE possiblefriends( 
 id INT NOT NULL AUTO_INCREMENT,  
 PRIMARY KEY(id), 
 user INT,  
 possiblefriend INT,
PRIMARY KEY (id),
UNIQUE INDEX DefUserID_UNIQUE (user ASC, possiblefriend ASC))

これにより、テーブルへのアクセスも大幅に高速化されます。

マスインサートに関する他の問題はもう少しトリッキーです。以下の組み込みのONDUPLICATEKEYUPDATE関数を使用できます。

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;
于 2010-11-11T08:30:46.437 に答える