0

私はこの問題に直面していませんが、常に頭に浮かびます..もちろん、これは memcached とパーティショニングを使用してデータを複製した後のみです...

photo_tbl があり、構造が以下のような場合

user_id
group_id
date_added
.... and many more 

ユーザー プロファイルでは、以下のクエリを実行してユーザーの写真を表示します

SELECT ...... FROM photo_tbl WHERE user_id=? order by date_added desc 

グループページでは、以下のクエリを実行してグループの写真を表示します

SELECT ...... FROM photo_tbl WHERE group_id=? order by date_added desc 

この場合、行が数十億で、上記の2つのクエリのパフォーマンスに影響を与えずに使用するキーのシャーディングが必要な場合..?

分割されたキーが user_id の場合、グループの場合、(アプリケーション ロジックを変更することによって) 目的の結果を得るために複数のデータベースに移動する必要があります。

4

1 に答える 1

3

基本的に 2 つの「シャード ツリー」があります。ユーザーごとおよびグループごとに分割する必要があります。単一のテーブルでこれを試みると、1 つの方法では常にすべてのシャードにわたってクエリが必要になりますが、これを効率的に行う方法があればそれほど悪くはありません。たとえば、dbShards を使用すると、シャード間で効率的なクエリを並行して実行できます (これらを「Go Fish」クエリと呼びます)。

他に考慮すべきオプションが 2 つあります。

  1. テーブルを複製し、1 つをユーザー別に分割し、もう 1 つをグループ別に分割します。すべての読み取りは単一のシャードに対して行われますが、2 回書き込む必要があります。

  2. 3 つのテーブルを使用します。写真 ID で分割された写真テーブル。ユーザーごとに分割された user_photos (user_id、photo_id、およびその他のフィールド)。グループごとに分割された group_photos (group_id、photo_id、およびその他のフィールド)。

これらのシナリオはよく見られますが、これらはお客様が取る通常のアプローチです。

于 2012-10-10T15:54:40.447 に答える