MySQL の innodb テーブルの場合、どちらが高速ですか:varchar(255) または tinytext?

StackOverflow https://stackoverflow.com/questions/1068825

質問

一部を最適化しています innodbテーブル MySQL にあるので実行しました プロシージャanasye() 推奨事項を確認してください。

推奨される結果 varchar(255) の代わりに tinytext 以前に varchar(255) として設定されたすべてのフィールド

ありますか パフォーマンスの向上 を使用することで得られる 小さなテキスト?ここではサイズではなく速度のみを懸念します。

役に立ちましたか?

解決

TINYTEXT は VARCHAR 以外の方法で保存されると誰かが言っても信じないでください。

実際の違いは次のとおりです。

  • TINYTEXT およびその他の TEXT フィールドは、MySQL ヒープ内のメモリ行とは別に保存されますが、VARCHAR() フィールドは合計で 64k の制限に達します (したがって、TINYTEXT では 64k を超えることができますが、VARCHAR ではそれができません)。

  • TINYTEXT およびその他の「ブロブのような」フィールドは、使用されるたびに SQL レイヤー (MySQL) にディスク上の一時テーブルを強制的に使用させますが、VARCHAR は引き続き「メモリ内」でソートされます (ただし、全幅の CHAR に変換されます)。 。

  • InnoDB は内部的には tinytext であるか varchar であるかをあまり気にしません。検証するのは非常に簡単で、1 つは VARCHAR(255) で、もう 1 つは TINYINT で 2 つのテーブルを作成し、両方にレコードを挿入します。どちらも単一の 16k ページを必要としますが、オーバーフロー ページが使用されている場合、TINYTEXT テーブルは「SHOW TABLE STATUS」で少なくとも 32k 必要であると表示されるはずです。

私は通常、VARCHAR(255) を好みます。VARCHAR(255) は単一行のヒープ断片化をあまり引き起こさず、MySQL 内のメモリ内で単一の 64k オブジェクトとして扱うことができます。InnoDB では、サイズの違いは無視できます。

他のヒント

私は varchar の方が tinytext よりも速いと予想しており、グーグルで検索したところ、それが一般的なコンセンサスのようです。もちろん、本当に確実であることを確認するにはシステムをテストする必要があります。

これが速い理由は、MySQL が特定の種類の操作 (結合、ソートなど) を実行するときに一時テーブルを作成することが多いためです。一時テーブルに BLOB タイプ (tinytext など) がある場合、テーブルはメモリ ベースではなくディスク ベースになり、当然パフォーマンスに影響します。

CHAR/VARCHAR は、これらの列がメインの行データ* と同じページに格納されるため、高速になります。一方、TEXT 型はオフページに格納されます。 (私は間違っていました。ハリソンのコメントを参照してください)。

varchar が末尾の空白を (迷惑なことに) トリミングしてしまうため、人々は tinytext をよく使用していました。この動作は MySQL 5.0 で削除されました。

(* 少なくとも最初の 768 バイトについては、新しい InnoDB プラグインではなく、組み込みの InnoDB を使用した場合)。

を使用することも検討したいかもしれません char(255) - より多くのスペースを使用しますが、(私の経験では) 後で比較するときに一定サイズのフィールドを使用する方が大幅に高速です。速度だけを求める場合は、余分なスペースをパディングで埋めることができ、後で空白を無視します。

ただし、次の点に注意してください。MySQLでは許可されません varchar そして char 同じテーブル内に複数の型が存在する必要があります。また、[通常] 間の比較も許可されません。 varchar そして char. 。昨年、趣味でテーブル実装をしていた時に知りました。 プロジェクト.

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