次の形式の(約10億)レコードの膨大なデータセットがあります
|KEY(varchar(300),UNIQE,PK)|DATA1(int)|DATA2(bool)|DATA4(varchar(10)|
現在、データはMySAM MYSQLテーブルに保存されていますが、問題は、キーデータ(12Gテーブルサイズのうち10G)が2回保存されていることです。1回はテーブルに、もう1回はインデックスとして保存されます。(データは追加されるだけで、テーブルにUPDATEクエリはありません)
データセットに対して実行される2つの主要なアクションがあります。
- 含む-キーが見つかったかどうかの簡単なチェック
- count-データフィールドに応じた(ほとんどの)集計機能
キーデータを1回だけ保存する方法はありますか?
私が持っていたアイデアの1つは、DBをすべてまとめて、2〜5文字のフォルダー構造を作成することです。これが、キー「thesimon_wrote_this」に割り当てられたデータがfsに次のように格納される理由です。
~/data/the/sim/on_/wro/te_/thi/s.data
このようにして、データセットはbtreeと同じように機能し、「含む」およびデータ取得機能はほぼO(1)で実行されます(HDDの明らかな制限があります)。
これにより、バックアップは非常に簡単になります(A属性を持つファイルのみをバックアップします)が、毎回10億のファイルをgrepする必要があるため、集計機能はほとんど役に立たなくなりました。ディスクスペースの5%だけが使用されないようにファイル構造を調整できるため、アロケーションユニットのサイズは関係ありません。
私は別の方法があると確信しています-それを行うためのはるかにエレガントな方法、私はそれをグーグルで検索することはできません:)。