0

次の形式の(約10億)レコードの膨大なデータセットがあります

|KEY(varchar(300),UNIQE,PK)|DATA1(int)|DATA2(bool)|DATA4(varchar(10)|

現在、データはMySAM MYSQLテーブルに保存されていますが、問題は、キーデータ(12Gテーブルサイズのうち10G)が2回保存されていることです。1回はテーブルに、もう1回はインデックスとして保存されます。(データは追加されるだけで、テーブルにUPDATEクエリはありません)

データセットに対して実行される2つの主要なアクションがあります。

  1. 含む-キーが見つかったかどうかの簡単なチェック
  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%だけが使用されないようにファイル構造を調整できるため、アロケーションユニットのサイズは関係ありません。

私は別の方法があると確信しています-それを行うためのはるかにエレガントな方法、私はそれをグーグルで検索することはできません:)。

4

1 に答える 1

0

64ビット整数のような固定幅整数キーを検討することは非常に良い考えのように思われます。varcharキーの保存検索は、比較すると非常に時間がかかります。高速ルックアップのために列にインデックスを追加することもできますKEYが、それを主キーにすることはできません。

于 2012-09-09T13:56:31.397 に答える