### 質問内容の目標
・1日毎に100億件を超えるデータの更新を行う
・大量のデータを高速に取り扱う方法
### 詳細
現在、Twitterアカウントのフォロワー情報を管理するシステムを構築しています。
アカウントの総数は約100万件で、それぞれのアカウントにフォロワーが平均1万人います。
アカウントのテーブルをuser_tableとし
フォロワー状態を格納するテーブルをstatus_tableとした場合
以下のような構造で構築をしています。
user_table | status_table |
---|---|
id | user_id |
follower_id |
user_tableはその他名前等のデータが格納され、idはprimaryな状態です。
status_tableではuser_idの重複が可能となっており、フォロワーアカウントIDを1つずつ格納する形でinsertしています。
目的としては、前日のフォロワーと当日のフォロワーを比較し、新規もしくは抜けたフォロワーを識別する事が目的となります。
現状の対応方法
現時点で試している方法としましては
status_tableとまったく同じ内容のテーブルをもう一つ作成しています(tmp_status_table)
tmp_status_tableに当日のフォロワー状態を格納し、status_tableには前日のデータを格納する事で
集計を行う際に、前日と当日のテーブルを比較する事で対応を考えています。
(比較の際はWhere文でuser_idを指定しまとめて取得※効率悪いです・・)
問題点について
アカウント100万件につきフォロワー数平均1万なので、status_tableではおよそ100億件のデータが格納されており
tmp_status_tableにも約100億件が格納されています
問題として、集計を確認し終えた際に、前日のデータを全て削除しなくてはならず
当日のデータをtmp_status_tableへ移行した後に当日のデータも全て削除する必要が有る為
かなりの負荷(200億件のDeleteと100億件のinsert)がかかる事となる為、現実的な速度は見込めないとゆう点が問題として有ります。
打開策案
1:BigQuery
処理速度が速く、分析に特化しているとゆう点でデータベースを利用するより効率が良いと思いましたが
サーバーと通信を取りたく、ネットワーク処理での不可が大きくなる為妥協
2:パーティション
アカウントID毎にパーティションを作成する事でdelete処理をパーティション単位で行う事が可能と考えていますが
アカウントによっては途中で凍結が行われ、削除されるアカウントが存在し、頻繁に変動をする予定なので
動的にパーティションを追加、削除をするのは管理として難しいのではないかとゆう考えです。
###追記
いくつものご回答いただきありがとうございます。
一度自分で回答内容をそれぞれ試してみたいので、質問欄は少し期間を開けてOpenのままにさせていただきます。
後に回答していただける方のご意見も全て読ませていただきます。
ベストアンサーについては、ある程度自分で触った後に私と同じような質問者の方のご意見もふまえて選定させていただく予定です。
皆さん貴重なご意見ありがとうございます。m(__)m