質問

バージョン5.0.3(Varcharが65,535バイトになり、トレイルスペースの切り捨てを停止することを許可した後)の後、これら2つのデータ型に大きな違いはありますか?

私は読んでいた 違いのリスト そして、2つのメモは次のとおりです。

BLOBおよびテキスト列のインデックスの場合、インデックスプレフィックスの長さを指定する必要があります。 CharおよびVarcharの場合、プレフィックスの長さはオプションです。セクション7.5.1、「列インデックス」を参照してください。

BLOBおよびテキスト列はデフォルト値を持つことはできません。

テキストデータタイプのこれら2つの制限のために、なぜVarchar(65535)でそれを使用するのですか?一方のパフォーマンスの影響はありますか?

役に立ちましたか?

解決

分割 基本的な問題を説明するいくつかの情報(パフォーマンスの違いがあります)にリンクされていますが、一方が他のものよりも常に優れていると言うほど単純ではありません。 (そうでなければ、両方を持っている理由はありません。)また、Myismでは、Varcharの64kの最大サイズはフィールドごとではありません - それはレコードごとです。

基本的に、データベースレコードに文字列を保存する4つの方法があります。

  1. 固定長
  2. Cスタイルの文字列(文字列の端にヌルまたは類似の文字がマークされています)
  3. パスカルスタイルの弦(長さを示すために数バイト、弦)
  4. ポインター(他のどこかに文字列を保存)

Myismは、Varcharで#3に似たものを使用し、レコードに文字列の先頭を保存するテキストのハイブリッドアプローチを使用し、他のどこかに文字列の残りを保存します。 INNODBはVarcharに似ていますが、レコード以外の完全なテキストフィールドを保存します。

1と4を使用すると、レコード内のものは常に同じ長さであるため、文字列が必要ない場合はスキップする方が簡単ですが、その後のものが必要です。 #2と#3の両方が短い弦にはそれほど悪くありません...#2はマーカーを探し続ける必要がありますが、#3は先にスキップできます...文字列が長くなると、#2はこの特定の使用で悪化します場合。

実際に文字列を読む必要がある場合は、レコードを読む必要があるため、#4が遅くなり、そのデータベースがどのように処理するかに応じて、ディスク上の他の場所に保存される文字列を読む必要があります。 #1は常に非常に簡単であり、#2がひもが長くなるほど#2が悪化するのは、非常に小さな文字列の場合は#3よりも少し悪いですが、長くなるにつれて#3が少し悪いと同様の問題に遭遇します。

その後、ストレージの要件があります...#1は常に固定された長さなので、ほとんどの文字列が最大長でない場合は膨らんでいる可能性があります。 #2には1つの追加バイトがあります。 #3通常、最大長の場合は2つの追加バイト= 255、64Kマックスの場合は4つの追加バイトがあります。 #4には、ポインターの長さに加えて、通常は#3のルールがあります。

MySQL 5.1内の特定の実装については、 Myism Stateのドキュメント:

  • 真のVarcharタイプのサポート。 Varchar列は、1つまたは2つのバイトに保存された長さから始まります。
  • varchar列のあるテーブルには、固定または動的な行の長さがあります。
  • テーブル内のvarchar列とchar列の長さの合計は、最大64kbになる場合があります。

その間 Innodbの場合 :

  • レコードヘッダーの可変長部分には、ヌル列を示すためのビットベクトルが含まれています。インデックス内のnullの列の数がnである場合、ビットベクトルは天井(n/8)バイトを占有します。 (たとえば、nullになる可能性のある9〜15列の範囲がある場合、ビットベクトルは2つのバイトを使用します。)nullの列は、このベクトルのビット以外のスペースを占有しません。ヘッダーの可変長部分には、可変長列の長さも含まれています。各長さは、列の最大長に応じて1つまたは2つのバイトを取ります。インデックス内のすべての列が無効で、固定長がある場合、レコードヘッダーには可変長い部分がありません。
  • 各非ヌル可変長フィールドごとに、レコードヘッダーには、列の長さが1つまたは2バイトに含まれています。列の一部がオーバーフローページに外部から保存されるか、最大長が255バイトを超え、実際の長さが127バイトを超える場合にのみ、2バイトが必要です。外部から保存された列の場合、2バイトの長さは、内部に保存されたパーツの長さと、外部から保存された部品への20バイトのポインターを示します。内部部分は768バイトなので、長さは768+20です。 20バイトのポインターは、列の真の長さを保存します。

...

データベースを扱う際に他の多くのことと同様に、ニーズに最適なものがわからない場合は、同様のデータと使用状況でベンチマークを付けて、それらがどのように振る舞うかを確認してください。

他のヒント

選択が一時テーブル(結果を並べ替えるなど)を作成する必要がある場合、メモリテーブルまたはmyisamテーブルのいずれかを作成します。メモリはより効率的です。メモリには制限があります - 1つはテキストとブロブを禁止することです。したがって、select 五月 Varcharよりもテキストで遅く実行します。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top