このデータが保存された前のテーブルは 3 ~ 4 GB に近づきましたが、データは保存の前後に圧縮されていませんでした。私は DBA ではないので、適切な戦略については少し詳しくありません。
テーブルは、アプリケーション (ユーザー プロファイル) の特定のモデルへの変更をログに記録するためのものですが、トリッキーな要件が 1 つあります。それは、任意の日付でプロファイルの状態を取得できる必要があるということです。
データ (単一テーブル):
id, username, email, first_name, last_name, website, avatar_url, address, city, zip, phone
要件は次の 2 つだけです。
- 特定のモデルの変更のリストを取得できる
- 特定の日付のモデルの状態を取得できる
以前は、1 つの列だけが変更された場合でも、すべてのプロファイル データが 1つの変更に対して保存されていました。しかし、特定の日付の「スナップショット」を取得するのは簡単でした。
データ構造を最適化するための私の最初のいくつかのソリューション:
(1) 変更された列のみを保存します。これにより、保存されるデータが大幅に削減されますが、データのスナップショットを取得することが非常に複雑になります。特定の日付 (数千になる可能性があります) までのすべての変更をマージしてから、それをモデルに適用する必要があります。しかし、そのモデルは新しいモデルではありません (変更されたデータのみが保存されます)。profiles
これを行うには、最初に現在のテーブルからすべてのデータをコピーし、次にスナップショットを取得してそれらの基本モデルに変更を適用する必要があります。
(2) データ全体を保存しますが、gzip やバイナリなどの圧縮形式に変換します。これにより、変更を取得する以外にデータをクエリする機能が削除されます。たとえば、すべての変更を取得できませんでしwhere email = ''
た。基本的に、変換されたデータを含む単一の列を持ち、プロファイル全体を格納します。
次に、ARCHIVE などの関連する MySQL テーブル オプションを使用して、スペースをさらに削減したいと考えています。
私の質問は、上記の 1/2 よりも優れたアプローチであると思われる他のオプションはありますか?