41から始めました

文字通り41歳から始めたブログです。DB(MySQL)を使ってお仕事してるので、DB周りの話を中心に最近始めたこととかをTwitterのノリで書いています。なお、本サイトにおいて示されている見解は私個人の見解であり、所属団体や組織を代表するものではありません。

char vs varchar

どっちがおススメなんだろう?

社内のテーブルで管理しているID値は36桁の固定長で構成される文字列にしているんだが、そのカラムの型がvarcharで、 charにした場合、領域小さくなったり、INDEX使用時の検索が早くなったりしないだろうか?と思い調査

現行のIDがvarcharの理由

ちなみに、ファイルフォーマットはBarracudaにし、データフォーマットはDYNAMICにしている。 これは、

Barracudaは可変長カラムの値をすべて外部のページに保存してローカルページにはそのページへの20バイトのポインタだけ保存 するため、36バイトの固定長よりも16バイト少なくキャッシュできることから、GUID値をあえてvarcharにしているとのこと。

実ファイルのサイズについてはvarcharのほうが多少多くなると思われるが、パフォーマンスはこの20バイトのポインタとcharとの 比較になるため、検証した。

検証方法

非常に遅いクエリ(IDを使って結合しているもの)を使って、その中で使われているテーブルをコピー。 コピーテーブルのほうはIDをchar型に変更。 テーブルのデフラグ(ALTER TABLE テーブル名 ENGINE=INNODB;)をかけたうえで処理時間とサイズを計測。 検証データは数百~数億のテーブル。 ディスクはフラッシュストレージ。 メモリ(バッファプール)は100GB程度使える状態。

検証結果

ほんのわずかだが現行のvarcharのほうが早かった。 現行8.4秒程度かかるものがchar型にすると8.6秒程度と微増。

ファイル(ibd)についてはchar側に変えたほうが1~5%くらい減っていた。

結論

固定長のカラムであろうと、varcharで作ってもMySQLならいいんじゃないか。 ※領域を少しでも減らしたいという要求が無ければ。