バージョン5.0.3(VARCHARを65,535バイトにできるようになり、末尾のスペースの切り捨てを停止した)以降、これら2つのデータ型の間に大きな違いはありますか?
私は 相違点のリスト を読んでいましたが、注意すべき2つだけは次のとおりです。
BLOB列とTEXT列のインデックスの場合、インデックスプレフィックス長を指定する必要があります。 CHARおよびVARCHARの場合、プレフィックス長はオプションです。セクション7.5.1「列インデックス」を参照してください。
そして
BLOB列とTEXT列にDEFAULT値を含めることはできません。
では、TEXTデータ型に対するこれらの2つの制限のため、なぜvarchar(65535)ではなくそれを使用するのでしょうか。どちらか一方のパフォーマンスに影響はありますか?
divided 基本的な問題(パフォーマンスの違いがある)を説明するいくつかの情報にリンクされていますが、一方が常に他方より優れていると言うのは簡単ではありません。 (それ以外の場合は、両方を使用する理由はありません。)また、MyISMでは、VARCHARの64kの最大サイズはフィールドごとではなく、レコードごとです。
基本的に、データベースレコードに文字列を格納する方法は4つあります。
MyISMはVARCHARに#3に似たものを使用し、文字列の先頭をレコードに格納し、残りの文字列を他の場所に格納するTEXTのハイブリッドアプローチを使用します。 InnoDBはVARCHARに似ていますが、完全なTEXTフィールドをレコードの外側に格納します。
1&4を使用すると、レコードの内容は常に同じ長さになるため、文字列は不要で、その後に文字列が必要な場合はスキップする方が簡単です。 #2と#3はどちらも短い文字列には悪くありません...#2はマーカーを探し続ける必要がありますが、#3は先にスキップできます...文字列が長くなると、この特定の用途では#2が悪化します場合。
文字列を実際に読み取る必要がある場合は、レコードを読み取る必要があるため、#4の方が遅くなります。その後、データベースの処理方法に応じて、ディスクの他の場所に格納されている可能性のある文字列を読み取ります。 #1は常に非常に単純明快で、#2は文字列が長くなるほど悪化しますが、#3は非常に小さな文字列の#2より少し悪いですが、長くなるほど改善されます。
次に、ストレージ要件があります...#1は常に固定長であるため、ほとんどの文字列が最大長でない場合は膨らむ可能性があります。 #2には1バイト余分にあります。 #3は通常、最大長= 255の場合は2バイト、最大長が64kの場合は4バイト追加されます。 #4には、ポインターの長さと、通常は#3のルールがあります。
MySQL 5.1内の特定の実装については、 MyISM状態のドキュメント :
While InnoDBの場合 :
...
データベースを扱うときの他の多くのことと同様に、ニーズに最適なものがわからない場合は、同様のデータと使用法でそれをベンチマークし、それらがどのように動作するかを確認してください。
SELECTが一時的なテーブルを作成する必要がある場合(結果をソートするなど)、それはMEMORYテーブルまたはMyISAMテーブルを作成します。 MEMORYの方が効率的です。 MEMORYには制限があります。1つは、TEXTとBLOBを許可しないことです。したがって、SELECT mayは、VARCHARよりもTEXTの方が実行速度が遅くなります。