私たちが開発しているアプリケーションは、毎日約4〜500万行のデータを書きます。そして、過去90日間これらのデータを保存する必要があります。アプリケーションについて古いデータをより速くアクセスできるように保存する方法
id INT PRIMARY AUTOINCREMENT
dt TIMESTAMP CURRENT_TIMESTAMP
user_id varchar(20)
data varchar(20)
:
表user_data
は、次の構造(簡体字)を持って7日齢より古い
- データが更新/書き込まれません。
- データはほとんどが
user_id
に基づいてアクセスされます(つまり、すべてのクエリはWHERE user_id = XXX
になります) - 現在約13000人のユーザーがいます。
- ユーザーは引き続き古いデータにアクセスできます。しかし、古いデータにアクセスする際には、時間範囲ではなく、1日のデータのみを取得できるように制限できます。 (たとえば、ユーザーが2016-10-01のデータを取得しようとすると、その日のデータが取得され、2016-10-01 13:00 - 2016-10のデータを取得することはできません-01 14:00)。現時点で
、我々は最新のデータ(すなわち、7日以降)を格納するためにMySQL InnoDB
を使用していて、それが正常に動作してinnodb_buffer_pool
にフィットされます。
古いデータでは、user_data_YYYYMMDD
の形式で小さいテーブルを作成しました。しばらくすると、私たちはこれらのテーブルがinnodb_buffer_pool
に収まりきらないと思って、それが減速し始めました。
日付に基づくシャーディング、つまりuser_idsに基づくシャーディングは、より良い(つまり、ユーザーと日付に基づくより小さいデータセットを使用して、user_data_[YYYYMMDD]_[USER_ID]
など)と考えています。これにより、テーブルをずっと小さな数にすることができます(せいぜい10K行程度)。日あたりの利用者(すなわちuser_data_[YYYYMMDD]_[USER_ID]
)ごとに保存するためにmysqlのテーブルを使用し
- :
周りに調査した結果、我々はいくつかのそこに選択肢があることを見出しました。
- 各
user_data_[YYYYMMDD]_[USER_ID]
- ためのMongoDBのコレクションを使用して、私はこの中に見最大の詐欺は、ときに我々我々は、テーブル/コレクション/ファイルの膨大な数を持っているということです
[USER_ID]/[YYYYMMDD].txt
に(JSONエンコードされた)古いデータを書きますこれを行う(すなわち、13000 x 90 = 1.170.000)。私たちが将来のスケーラビリティの点でこれに適切にアプローチしているのだろうかと思います。あるいは、これに対して他の標準化された解決策がある場合。
ありがとう、Joshua。間違いなくPARTITIONの詳細を探そうとします。 –