0

私はソーシャルネットワークのウェブサイトに取り組んでいるので、ユーザーがたくさんいることを願っています。すべてのユーザーのタグ(キー|カウンター)を保存する必要があります。1)大きなテーブルと2)1つの非常に大きなテーブルと3)分割された大きなテーブルを使用する方がよいのではないかと思います。

1)これは多くのテーブル実装の例です

テーブルuserid_tags(すべてのユーザーが独自のテーブルを持っています)

key   | counter
-----   ---------
tag1  |   3
tag2  |   1
tag3  |   10

Query 1: SELECT * FROM userid_tags WHERE key='tag1'
Query 2: SELECT * FROM userid_tags

2)単一テーブルの実装:

テーブルタグ

key   | counter | user_id
-----   ------------------
tag1  |   3     | 20022
tag2  |   1     | 20022
tag2  |   10    | 31234

Query 1: SELECT * FROM userid_tags WHERE key='tag1' AND user_id='20022'
Query 2: SELECT * FROM userid_tags AND user_id='20022'

3)分割テーブルの実装

テーブル1000_tags(user_idは1から1000)

key   | counter | user_id
-----   ------------------
tag1  |   3     | 122
tag2  |   1     | 122
tag2  |   10    | 734

テーブル21000_tags(20000から21000までのuser_id)

key   | counter | user_id
-----   ------------------
tag1  |   3     | 20022
tag2  |   1     | 20022
tag2  |   10    | 20234

Query 1: SELECT * FROM userid_tags WHERE key='tag1' AND user_id='20022'
Query 2: SELECT * FROM userid_tags AND user_id='20022'

3)良い分割インデックスとは何ですか?私は本能に従って1000人(ユーザー)を使用しました

4

2 に答える 2

3

2が正解です。ユーザーごとに1つのテーブル、または1000タグごとに1つのテーブルを維持する方法を考えてください。テーブルをどのように作成/更新/削除しますか?大量の変更を行う必要がある場合はどうなりますか?どのテーブルから選択する必要があるかをどのように判断できますか?可能であっても、それらのテーブルの複数から同時に選択する必要がある場合はどうなりますか(たとえば、2人のユーザーのタグを取得します)。

テーブルを分割しても、そのままではパフォーマンス上のメリットはあまりありません。確かに、テーブルが大きくなると、mysqlがキーを作成する必要があるため、挿入が遅くなる可能性がありますが、適切なキーがある限り、ルックアップは非常に高速である必要があります。

別の同様の解決策は、タグ用のテーブル、ユーザー用のテーブル、および両方をマップするテーブルを用意することです。これにより、タグのカーディナリティが小さく保たれ、両方のテーブルにauto_incrementサロゲートキーを使用している場合、両方のキーの長さが短くなり、関係に制限がなく、できるだけ速く検索できるようになります(つまり、把握する必要があります)。他のユーザーのために結合する他のテーブル)。

于 2013-03-16T17:22:52.907 に答える
2

オプション2を使用することは、これを処理する正しい方法です。ただし、テーブル内でパーティションを使用することはできます。パーティションの使用に関するすべての情報は、MySQLのドキュメントに記載されています。

1000ユーザーごとにテーブルをパーティションに分割すると、次のようになります。

CREATE TABLE tags (`key VARCHAR(50), counter INT, user_id INT)
    PARTITION BY KEY(user_id) partitions 1000;

21001の場合は、user_id次のような正しいパーティションで検索を開始できます。

SELECT * FROM tags PARTITION (p22);'

ID21001は22番目のパーティションにあるためです。詳細については、リンクを確認してください。

于 2013-03-16T17:37:14.147 に答える