どっちがおススメなんだろう?
社内のテーブルで管理している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ならいいんじゃないか。 ※領域を少しでも減らしたいという要求が無ければ。