0

私は、VARデータ型以外のすべてがそれらの s を変えないことを発見しましたLENGTH。列内の aが完全な 8 バイトを取る場所で、決して変わらない a のINTようなフィールドがある可能性があるため、これは非常に非効率的であると私は思います。autoincrement PRIMARY1BIGINT

挿入すると変更されないが、大きくなる可能性がある列が多数あります。すべてのBIGINT列を使用する代わりに、代わりに使用したいと思いますVARBINARY

データをintC++で操作しながらVARBINARY、mysqlのように保存したい。

これらの変換は c++ でどのように行うことができますか?

4

2 に答える 2

3

これに対して強くお勧めします。

の MySQL ドキュメントをVARCHAR見ると、

VARCHAR値は、1 バイトまたは 2 バイトの長さのプレフィックスとデータとして格納されます。長さのプレフィックスは、値のバイト数を示します。

0xDEADBEEF2B84F00D のような 64 ビット値を取りましょう。それをフィールドに格納すると、BIGINT8 バイトかかります (バイナリ値として格納されます)。

それを として格納VARCHARすると、数値が常に 16 進数であると仮定しても、長さフィールドに 1 バイトまたは 2 バイト、さらに 16 進数文字にさらに 16 バイトが必要になります。18 バイトであり、ASCII との間で変換する必要があるためパフォーマンスが低下します。これはひどいトレードオフです!

反対のケース、0x01 を見てみましょう。BIGINTフィールドに格納され、まだ 8 バイトです。以前と同じ規則を使用すると、データベースではおそらく 3 バイトになります。私の意見では、それだけの価値があるとは言えません。特に、一連の ASCII データでデータベースのパフォーマンスがどれほど低下するかを考えると。

やらないでください。データベースを設計どおりに使用します。

于 2013-03-21T04:38:40.200 に答える
1

これは負け組だと思います。クラッジに頼らないとデータがシステムに収まらないことを示すことができない限り、整数値には整数型を使用する方がよいと思います。そうでなければ、誰かがあなたの数値 ID 列に「こんにちは」を挿入するのを防ぐにはどうすればよいでしょうか。おそらく全体的に遅くなるでしょう。

于 2013-03-21T04:35:35.877 に答える