11

約5文字しか使用しないのに、Djangoを使用してCharField(max_length = 255 )を設定しています。これは効率が悪いですか?varcharではそれほど重要ではないことを読みましたが、必要なものだけを指定することでハードドライブのスペースを節約できることを読みました。

4

5 に答える 5

14

一般に、varchar(255) は varchar(1) と同じ量のストレージを必要とします。いずれの場合も、テーブルは文字列テーブルへのポインターのようなものと長さを格納します。たとえば、4 バイトのオフセット + 1 バイトのサイズ = 1 行あたり 5 バイト固定で、オーバーヘッドのためだけです。

もちろん、実際のコンテンツは文字列テーブルにあります。これは、格納されている文字列の長さだけです。したがって、5 文字の名前を varchar(255) フィールドに格納すると、(たとえば) 5 オーバーヘッド バイト + 5 コンテンツ バイト = 10 バイトしか使用されません。

varchar(10) フィールドを使用すると、まったく同じ量が使用されますが、10 バイトを超える文字列のみが切り捨てられます。


もちろん、具体的な数値はストレージ エンジンの実装によって異なります。

于 2010-01-13T08:37:57.863 に答える
5

varcharは、文字列の長さを格納するためのオーバーヘッドを除いて、格納する文字列よりも多くのスペースを占有しません。

+------------------------------------------+---------------------------------+
| Value      | CHAR(4)    Storage Required | VARCHAR(4)   Storage Required   |  
+------------+-----------------------------+---------------------------------+
| ''         | '    '     4 bytes          | ''           1 byte             |
| 'ab'       | 'ab  '     4 bytes          | 'ab'         3 bytes            | 
| 'abcd'     | 'abcd'     4 bytes          | 'abcd'       5 bytes            |
| 'abcdefgh' | 'abcd'     4 bytes          | 'abcd'       5 bytes            |
+------------+-----------------------------+---------------------------------+

ただし、実際に5文字しか必要としない場合、テーブルに他の可変幅の列(つまり、varchars、text、blob)がない場合は、char(5)の使用を検討してください。次に、固定長のレコードがあります。これには、いくつかのパフォーマンス上の利点があります。

頻繁に変更されるMyISAMテーブルの場合、すべての可変長列(VARCHAR、BLOB、およびTEXT)を避けるようにする必要があります。可変長の列が1つでも含まれている場合、テーブルは動的行形式を使用します。第13章「ストレージエンジン」を参照してください。

于 2010-01-13T09:29:06.570 に答える
2

varchar の代わりに char を使用する場合の 1 つの注意点は、文字セットが割り当てられる必要があるスペースに影響することです。たとえば、その列の文字セットが utf8 の場合、1 文字を格納するのに 3 バイトが必要になる可能性があります。

char 列は、格納される内容に関係なく固定サイズの割り当てになるため、データベースは最悪のケースに対応する必要があります。そのため、MySQL は、実際にはすべての行に 5 つのシングルバイト文字しか格納していない場合でも、その char(5) 列に対して行ごとに常に 15 バイトを割り当てる必要があります。

varchar は、各行が格納されるときに必要なものだけを使用するため、同じ 5 つの 1 バイト文字が 6 または 7 バイトしか占有しません。余分な 1 バイトまたは 2 バイトは、実際の長さを追跡するためのものです。シングルバイト文字セットで幅が最大 255 の varchar の場合、MySQL は実際の幅を格納するために 1 バイトのみを割り当てる必要があります。幅が 256 ~ 65,535 の varchar は、長さを格納するために 2 バイトを必要とし、1 バイト文字セットを想定しています。

utf8 varchar(255) は 255*3 バイトのストレージを必要とする可能性があるため、MySQL は長さを格納するために 2 バイトを割り当てる必要があります。この情報の多くは、ここの MySQL ドキュメントで説明されています。

65,535 の幅を宣言できますが、有効な最大サイズ (バイト単位) は 65,532 です。ただし、格納する文字セットと文字によっては、それよりもはるかに少ないマルチバイト文字を最大で格納できます。

ただし、Paul が指摘しているように、行全体を固定幅にすることができる場合は、依然として char を使用することをお勧めします。特に、オフセットが固定されているため、特定のシーク (最初の 1000 行をスキップするなど) が高速になることがあります。

列の更新に関して考慮すべきパフォーマンスの問題もあります。char(5) があり、1 文字で開始し、値を 5 文字に更新すると、その行をその場で更新できます。varchar を使用すると、ストレージ エンジンの実装によっては、行全体を新しい場所に書き直す必要がある場合があります。

最後に、永続テーブルから結果セットをソートするために MySQL がインメモリ一時テーブルを作成する必要がある場合、MySQL は固定長レコードを使用します。そのため、これらの特大の varchar 列には、予想よりも多くのメモリ領域が割り当てられます。これは、メモリ ストレージ エンジン テーブルの MySQL ドキュメントで説明されています。MySQL はディスクベースのソートでもこれを行っていると思います。

于 2010-01-29T08:36:17.587 に答える
1

ハード ドライブ スペースは安価ですが、CPU キャッシュ スペースは高価です。大きなフィールドよりも小さなフィールドを多く収めることができます。

于 2010-01-13T08:29:22.957 に答える
0

不必要に大きなスペースを使用する代わりに、すべての文字を読み取る必要がないため、より多くの保管場所を提供するだけでなく、実行速度も速いスペースを利用してください。varchar(255)を割り当て、テキスト「abc」を追加すると、文字「a」、「b」、「c」などがスペースとして読み取られます。

したがって、最大スペースを維持するのではなく、常に必要なスペースuを使用してください。

于 2010-01-13T09:22:29.660 に答える