web-dev-qa-db-ja.com

TEXTをVARCHARに変更する

MySQLデータベース(InnoDB)には、約60.000.000行を含むテーブルがあります。列の1つはタイプtextです。

現在、最長のエントリの長さは360(SELECT MAX(LENGTH(value))を使用して検出)であり、理論上の最大値はvarchar(511)列から取得されます。列にインデックスはありません。

この列をtextから別の列に移動できるかどうかを確認するようにアドバイスされましたが、これがまったく役立つかどうかを確認するのに苦労しています。もちろん調べてみましたが、正解かどうかも確認したいと思います。 「ランダムアドバイス」はあまり真剣に受け止められていないことは知っていますが、一見したところ、いくつかのメリットがあるように見えました。textは大きく、最大511文字はそれほど大きくありません。

しかし、私が知る限り、InnoDBを使用する場合、varchar/varbinaryとtext/blobは同じように処理されます。大きな値で直面する可能性のある問題は、テキストを使用するときに、すべてがディスク上の同じ「行」(ページ?ここでの用語がわからない)に格納されるわけではないということです。一部のテキストは実際には通常の行が保存されるのと同じ場所に保存されるため、これは誤解であると言う情報源がいくつかあります。 (私はこの権利を説明していると思います)

結局、私の結論は、現時点では、この列をある種のvarchar(おそらくvarchar(511))に変更することに特別な追加の値はないということでした。

1
Nanne

これは漠然とおなじみのようです。そうそう、私はこれについて2012年8月14日に書き戻しました: エラー1118:行サイズが大きすぎます。utf8innodb 。このテーマに関するPerconaエキスパートからの追加情報は次のとおりです: InnoDB create table error:“ Row size too large”

これにより、行の長さの制限に関してInnoDBテーブルに負担がかかることがわかります。不吉な長さのTEXTフィールドをInnoDBでVARCHARまたはCHARに変換しても効果はありません(少なくとも、プラスの効果はありません)。

あなたの懸念は非常に有効であり、ある程度の敬意を払う価値があります。どうして?

次のいずれかを行う人もいます。

  • 変換を実行し、より悪い結果に対処します(主に不平を言います)
  • 開発サーバーで変換を実行し、効果を確認して、それに応じて判断します
  • 理由を尋ね、調査を行い、開発サーバーでデューデリジェンスを実行します

上記のリストのオプション#3を実行したようです。データの長さを考えると、あなたの結論はあなたの与えられたデータセットにとって正しいです。

1
RolandoMySQLDBA