2012-02-06 14 views
2

私は32768ビットの長いビット列をMySQLテーブルに格納する必要があります。このデータの必要性はいつでも索引付けされる必要はなく、フルテキストで検索される必要もありません。私が正しく読んだら、このサイズは、max_packet_sizeと行サイズ制限@ 65kの両方の範囲内でなければなりません。長いビットストリングに最も効率的なMySQLデータタイプは何ですか?

理想的には、0b形式で文字列を格納したいのですが、これは必須条件ではありません。ディスク上のデータ/サイズが本質的に1:1になるものはどれも素晴らしいでしょう。

BLOBは、1と0( '010101010101')のみからなる文字列が通常のテキストと変わらず、Lバイト+2のコストがかかるため、十分に機能していないようです。BIT()は完璧です最大64ビットに制限されています。

多くのデータ(90%+)は、符号なしBigint内で十分に表現されますが、残りの10%は論理的に分割するよりも洗練されたソリューションを見つけることを奨励します。残りの10%の行にはBLOBを使用するセカンダリ表など)。

ビット単位の操作を許可する任意のタイプのボーナスが追加されますが、それ以外の場合は、MySQLサーバの外部で簡単に実行できます。

この目的で最も効率的なデータ型は何ですか?

答えて

2

私は主にあなたのアクセスパターンに依存していると言います。各アクセス時にビットストリーム全体を読み書きすることができれば、varbinary(4096)はうまく動作し、コンパクトになります(フィールド全体のオーバーヘッドは2バイトに過ぎません)。このモデルでは、アプリケーション側の1ビットは実際にはデータストレージ内の1ビットで表され、クライアントアプリケーションはビットストリングとして解釈します(ビット単位の操作など)

もう少し最適化するには、BIGINTとvarbinary型(4096)を持つテーブルを想像することができます:二つのフィールドの

create table dummy (
    dummykey int not null, 
    bit1 bigint null, 
    bit2 varbinary(4096) null, 
    primary key(dummykey) 
); 

つだけが指定されたレコードのnullではありません。 bit1がヌルでない場合は、64ビットを格納できます。大きいビットストリングの場合、bit1はnullで、代わりにbit2が使用されます。クライアントアプリケーションは、すべてのビット演算を処理するのに十分スマートでなければなりません(ビット1の符号付き/符号なしの問題に特に注意してください)。

+0

私はvarbinaryも調べましたが、[storage requirements](http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html)によると、varbinary 32768)はまだ私のbitstringの1ビットあたり1バイトのコストが...または私はこれが長い文字列のためにできるように最適化されていると期待する必要がありますか? – hexparrot

+0

私はあなたの提案を理解しています:varbinary(4096)の各ビットは、代わりに文字列の8文字を表す文字であり、varbinary文字列を繰り返してこれらの値を決定し、最終ビット文字列を復元します。 これは間違いなく理想的です。なぜなら私はクライアントの計算時間をサーバー上のストレージとアクセス時間に交換したいからです。ありがとうございました! – hexparrot

1

BLOBタイプはあなたが必要とするものだと思います。これは、2^16 バイトまでのバイナリ文字列を表し、レコードごとに2 バイトのオーバーヘッドを有することができる(L値のバイトの長さである場合、L + 2 バイトは、ディスク上のサイズです) 。

その後、あなたは本当に、最適化VIEWで、その後UNIONそれら2つのテーブル、BLOBと1とTINYBLOBと他の(文字列の最大2^8 バイト、1 バイトオーバーヘッド)を、使用したい場合またはSELECTの間。

あなたは、さらに最適化BIGINTで3番目のテーブルを使用する場合(これは、残りの6は、バイナリ文字列の長さを格納するのに必要とされるであろうことから、58 ビットまでのバイナリ文字列を格納できるようになります)。

+0

@Didierの回答にとても満足している主な理由の1つは、ディスクストレージの最小使用の主な懸案事項に対処したことです。 BLOBまたはTINYBLOBを使用してバイナリ文字列を格納すると、1ビットあたり1バイトのコストがかかります。たとえば、 '01010101'はこれらのタイプで8バイト(8ビット/ char)です。 2つまたは3つのテーブルunionedとBIGINT null、VARBINARY nullはKISSの原則から離れているようですが、入力していただきありがとうございます。 – hexparrot

+0

@hexparrotあなたが主張していることが書かれているマニュアルを指摘していただけますか? AFAIU、MySQLのマニュアルによると、TINYBLOBに1バイトを格納するには、8ではなく2バイトが必要です。 – CAFxX

+0

[ストレージ要件](http://dev.mysql.com/doc/refman/5.0/en/storage-requirements .html)は、BLOBが "L + 2バイト、ここでL <2^16"であることを示しています。ここで、 "Lは、指定された文字列値の実際のバイト長を表します。 あなたの解決策では、受け入れられた解決方法と同じビット単位の解析が推奨されないため、私はあなたが私の '10101010'文字列をAS-ISとして格納することを意味すると見なすことができます。 これは、実際にはBLOBあたり2バイトのオーバーヘッドオーバーヘッドではなく、実際のデータの格納に関するものです。 – hexparrot

関連する問題