MySQL でいくつかのinnodb テーブルを最適化しているので、手順 analsye()を実行して推奨事項を確認しました。
結果は、以前に varchar(255) として設定されたすべてのフィールドに対して、varchar(255) の代わりに tinytextを推奨しました。
tinytextを使用することで得られるパフォーマンスの向上はありますか? ここでは、サイズではなく、速度のみに関心があります。
MySQL でいくつかのinnodb テーブルを最適化しているので、手順 analsye()を実行して推奨事項を確認しました。
結果は、以前に varchar(255) として設定されたすべてのフィールドに対して、varchar(255) の代わりに tinytextを推奨しました。
tinytextを使用することで得られるパフォーマンスの向上はありますか? ここでは、サイズではなく、速度のみに関心があります。
TINYTEXT が VARCHAR 以外の方法で保存されていると誰かが言っても信じないでください。
実際の違いは次のとおりです。
TINYTEXT およびその他の TEXT フィールドは、MySQL ヒープ内のインメモリ行とは別に格納されますが、VARCHAR() フィールドは最大 64k の制限まで追加されます (したがって、TINYTEXT に 64k を超える値を含めることができますが、VARCHAR ではできません)。
TINYTEXT およびその他の「ブロブのような」フィールドは、SQL レイヤー (MySQL) が使用されるたびにディスク上の一時テーブルを使用するように強制しますが、VARCHAR は引き続き「メモリ内」でソートされます (ただし、全幅の CHAR に変換されます)。 .
InnoDB は、それが tinytext であるか varchar であるかを内部的にあまり気にしません。VARCHAR(255) を使用するテーブルと TINYINT を使用するテーブルの 2 つのテーブルを作成し、両方にレコードを挿入することは非常に簡単です。どちらも単一の 16k ページを使用しますが、オーバーフロー ページが使用されている場合、TINYTEXT テーブルは「SHOW TABLE STATUS」で少なくとも 32k を使用するように表示されます。
私は通常 VARCHAR(255) を好みます - それらは単一行のヒープ断片化をあまり引き起こさず、MySQL 内のメモリで単一の 64k オブジェクトとして扱うことができます。InnoDB では、サイズの違いはごくわずかです。
varchar は tinytext よりも高速であると予想されます。私のグーグル検索では、それが一般的なコンセンサスのようです。もちろん、本当に確実であるためには、システムをテストする必要があります。
高速な理由は、MySQL が特定の種類の操作 (結合、並べ替えなど) を実行するときに一時テーブルを作成することが多いためです。一時テーブルに BLOB タイプ (tinytext など) がある場合、テーブルはメモリ ベースではなくディスク ベースになり、もちろんパフォーマンスに影響します。
使用することも検討することをお勧めしますchar(255)
-より多くのスペースを使用しますが、後で比較を行うときに一定サイズのフィールドを使用する方が(私の経験では)大幅に高速です。速度だけを探している場合は、余分なスペースをパディングで埋めることができ、後で空白を無視します。
ただし、注意: MySQL ではvarchar
とchar
タイプが同じテーブルに存在することは許可されません。[通常] と の比較も許可しませvarchar
んchar
。昨年、趣味のプロジェクトでテーブルの実装を行っていたときに、これを発見しました。