データ管理の観点から、ヒストグラムはアトミックですか?つまり、ヒストグラム全体をデータベース内の分割できない単位として常に読み取りまたは書き込みますか?
はいの場合は、BLOBにシリアル化するだけです。BLOBに書き込む前に、圧縮ライブラリをスワイプすることもできます。
いいえの場合は、次のようなものを使用することを検討してください。
CREATE TABLE HISTOGRAM (
HISTOGRAM_ID int PRIMARY KEY
-- Other fields...
);
CREATE TABLE HISTOGRAM_VALUE (
HISTOGRAM_ID int REFERENCES HISTOGRAM (HISTOGRAM_ID),
BUCKET_NO smallint,
VALUE decimal NOT NULL, -- Or whatever type is appropriate.
PRIMARY KEY (HISTOGRAM_ID, BUCKET_NO)
);
(注:256を超えるバケットが必要になることは絶対にないと確信している場合は、を使用tinyint
してBUCKET_NO
、スペース効率をさらに高めることもできます。)
InnoDBテーブルは常にクラスター化されているため、HISTOGRAM_VALUE
上記のテーブルは単一のBツリーであり、テーブルヒープや他のBツリーはありません(セカンダリインデックスがないため、外部キーはプライマリインデックスから直接満たすことができます)。 )。これは、InnoDBテーブルで取得できるのとほぼ同じくらい効率的なストレージです。
スペースを節約するには、ヒストグラムがそのようなバケットで開始または終了する場合を除いて、値が0のバケットを省略します。例えば...
0 0 14.7 -12.9 0 0 55.1 0 0 0
...次のように表すことができます:
HISTOGRAM_ID BUCKET_NO VALUE
1 1 0
1 3 14.7
1 4 -12.9
1 7 55.1
1 10 0