アドバイスを求めています。私はシャーディングを使用したことはありませんが、最近それについて何かを読み、データベース (PostgreSQL 9.1) での長時間の実行クエリに役立つと思います。
説明
posts
2億行のテーブルがあります。- 各投稿には、
projects
テーブルへの外部キーがあります。 - 各プロジェクトの posts テーブルには 100 ~ 300,000 行あります (平均: 30,000)
projects_id
通常、外部キーのプロジェクト テーブルと結合された posts テーブルでクエリを実行します。- 他のテーブルのページとの結合を実行することはめったにありません。
ページに 100,000 行を超えるプロジェクトでは、私のクエリ (特定の期間と集計で追加された投稿を取得する) が非常に遅くなります。
シャーディングを使用する必要がありますか?
もし、そうなら:
- どのようにシャードする必要がありますか?
projects_id
ページテーブルでキーとして使用する必要がありますか? - テーブルページを分割するだけで十分ですか (posts_1、posts_2 ... テーブルを作成します)?
- 1 台のマシン (さまざまなディスク上のシャード テーブル) で複数のディスク (パーティション) を使用する必要がありますか?
そうでない場合:
シャーディングの代わりに何を使用すればよいですか? より高速なディスク (SAS) を搭載したサーバーを購入しました。それは役に立ちましたが、十分ではありませんでした。マスター/スレーブ (pgPool2 を使用) を使用しようとしましたが、スレーブ データベースでより長いクエリを実行したい場合、次のエラーが発生します。
エラー: リカバリと競合するため、ステートメントをキャンセルしています 詳細: ユーザー クエリは、削除する必要がある行バージョンを確認する必要があった可能性があります。
シャーディングに関する詳細な質問:
- 各シャード テーブル (posts_1、posts_2...) にいくつの行を含める必要がありますか?
- PostgreSQL でのシャーディングに最適なソリューション/ツールは何ですか? Pl/プロキシ?