[MySQL] テキストにはVARCHAR型と?TEXT型のどちらを使うべきか?

MySQLのテキスト型にはVARCHARと?TEXT(TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT)がある。長さの制限が違うだけで、どれを使ってもテキストを格納できるが、それぞれ特性は違うのだろう。プログラミングを実践する上でどのテキスト型を使うのが適切なのか判断できるように、これらの違いについてきちんと理解しておきたい。

ざっくりググってみると、テキスト型の違いを論じているページがいろいろ見つかる。

Takahiko HORIUCHI – Google+ – RDBMS に MySQL を採用したシステムで、VARCHAR の代わりに TEXT…
https://plus.google.com/113405959631093302363/posts/E4tDXucskqb

VARCHAR と ?TEXT の違い – ngの日記
http://ngyuki.hatenablog.com/entry/20110804/p1

MySQLのテキスト型 | Koumei Soft 開発ログ
http://blog.ks2.info/?p=462

mysqlのvarchar型 – Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1256083387

MySQLのVARCHARサイズについて – Togetter
http://togetter.com/li/54358

一番上のページからリンクされていた英語ページの説明が的を得ている。

TEXT vs. VARCHAR
http://www.pythian.com/blog/text-vs-varchar/

MySQL: TEXT vs. VARCHAR Performance | NicJ.net
http://nicj.net/mysql-text-vs-varchar-performance/

これらのページを読んでわかったことは、MyISAMストレージエンジンに限って言えば「VARCHAR型はDBストレージ内にデータそのものが格納されるが、TEXT型だとデータは外部に格納されてDBストレージにはそのポインタが格納される」ということ(InnoDBは違うらしい)。これより、データのアクセス速度は、ポインタを追ってデータの実体にたどり着かなければならないTEXT型よりも、DBストレージに直接データが格納されているVARCHAR型のほうが高速であることは容易に推測できる。さらに、TEXT型のサイズに神経質になる必要が無い反面、VARCHAR型のサイズはデータベースのストレージサイズの制限に影響されるので、大きいサイズのデータをVARCHAR型で格納することはコスト高になることも想像に容易い。

さらに、2番目の英語ページでは以下の結論で結んでいる。

  • ストレージの使い方に由来して、TINYTEXTを使うよりもVARCHARを使ったほうが望ましい。
  • NULL以外のDEFAULT値をセットしたい場合には、VARCHAR(あるいはCHAR)を使うしかない。
  • ざっと64KBよりも長い文字列を格納する必要がある場合は、MEDIUMTEXTやLONGTEXTを使う。VARCHARは64KBより長い文字列を格納できないから。
  • マルチバイト文字列を格納する場合には更に注意が必要。VARCHAR(255)は255文字を格納できるが、マルチバイト文字列を使う場合にはデータサイズが255バイトよりも大きくなることに注意。

小規模なシステムでは大した問題にはならないが、マスなデータを取り扱うシステムではVARCHAR型と?TEXT型の選び方が大事だろう。自分がどうしてVARCHAR型あるいは?TEXT型を選んだのか、きちんとした理由が説明できるようにしておきたい。