[MySQL] InnoDBにおける各データ型のサイズまとめ
始めに
MySQLのスキーマ設計においてデータ型ごとにストレージ上のサイズを考慮することはディスク容量の最適化の上で重要です。
この記事では各データ型ごとのサイズについてご紹介します。
1. 数値型のサイズ
データ型 | サイズ |
---|---|
TINYINT | 1バイト |
SMALLINT | 2バイト |
MEDIUMINT | 3バイト |
INT | 4バイト |
BIGINT | 8バイト |
FLOAT(p) | 0<=p<=24の場合は4バイト、25<=p<=53の場合は8バイト |
FLOAT | 4バイト |
DOUBLE | 8バイト |
DECIMAL(M, D) | 下記を参照 |
BIT(M) | (M+7)/8を丸めたバイト数 |
Bitのデータサイズ計算について
Bit(M)はMビットを表現するデータ型です。実際のデータ自体はMビットですが、MySQLのデータ型のサイズはバイト単位であるため、(M+7)/8を整数値に丸めたバイト数がBit(M)のデータサイズとなります。
2. 日時型のサイズ
MySQL5.6.4以降ではTIME、DATETIME、TIMESTAMPがコンマ秒の時間を格納できるようになったため、それ以前のバージョンとストレージ上のサイズが異なります。
データ型 | MySQL 5.6.4 より前で必要なストレージ | MySQL 5.6.4 以降で必要なストレージ |
---|---|---|
YEAR | 1バイト | 1バイト |
DATE | 3バイト | 3バイト |
TIME | 3バイト | 3バイト+コンマ秒用のストレージ |
DATETIME | 8バイト | 5バイト+コンマ秒用のストレージ |
TIMESTAMP | 4バイト | 4バイト+コンマ秒用のストレージ |
TIME、DATETIME、TIMESTAMPのコンマ秒はマイクロ秒(小数第6位)までの精度を指定でき、指定した精度に応じて必要なストレージが変わります。
コンマ秒精度 | 必要なストレージ |
---|---|
0 | 0バイト |
1-2 | 1バイト |
3-4 | 2バイト |
5-6 | 3バイト |
2. 文字列型のサイズ
以下、Mは定義されたカラムの長さ, Lは格納された文字列の実際の長さを表すとします。
可変長文字列のサイズ計算について
可変長文字列はデータの先頭に可変長文字列の文字列長を格納し、実際のデータが後につづきます。
文字列長が
同様に文字列長が
以下はhelloという文字列をVARCHARに格納したときのストレージを図解したものです。長方形1つで1バイトを表します。
文字セットを指定できる型のサイズ
文字セットを指定できる型(CHAR, VARCHAR, TEXTなど)のサイズは使用している文字セットによって異なります。ここでは各文字のバイト数が一定(wバイトとする)と仮定します。
データ型 | サイズ |
---|---|
CHAR(M) | M*wバイト |
VARCHAR(M) | M*w < 255なら、M*w + 1バイト、M*w >= 255 バイトならM*w + 2バイト |
TINYTEXT | L*w + 1バイト ただしL*w < |
TEXT | L*w + 2バイト ただしL*w < |
MEDIUMTEXT | L*w + 3バイト ただしL*w < |
LONGTEXT | L*w + 4バイト ただしL*w < |
文字セットを指定しない型のサイズ
データ型 | サイズ |
---|---|
BINARY(M) | Mバイト |
VARBINARY(M) | M < 255なら、M + 1バイト、M >= 255 バイトならM + 2バイト |
TINYBLOB | L + 1バイト ただしL < |
BLOB | L + 2バイト ただしL < |
MEDIUMBLOB | L + 3バイト ただしL < |
LONGBLOB | L + 4バイト ただしL < |
ENUM('value1','value2',...) | 列挙値の数 (最大 65,535 個の値) により1または2バイト |
SET('value1','value2',...) | 集合のメンバー数 (最大 64 メンバー) により、1、2、3、4、または 8 バイト |
ENUMのデータサイズ計算について
ENUMでは列挙値に対して1から順に整数値を割り当てます。そのため、列挙値の数が255以下であれば1バイトにおさまります。255以上の場合は2バイトが必要となります。
SETのデータサイズ計算について
SETでは各メンバーに対してビットフラグにより集合内に含まれるかを表現します。そのためメンバー数分のビット数(Nとする)が必要になります。
MySQLのデータ型サイズはバイト単位で決定されるため、(N+7)/8を整数値に丸めたバイト数がSETのサイズとなります。
参考資料
関連記事リンク
MySQLの整数値型 詳解
MySQLの小数値型 詳解
MySQLの文字列型 CHAR、VARCHAR 詳解
MySQLのバイナリデータ型 BINARY, VARBINARY 詳解
MySQLのTEXT、BLOB 詳解
MySQLのENUM型 詳解
MySQLの時間データ型 詳解
MySQLのJSON型 詳解
MySQL - innodbにおける各データ型のサイズまとめ
Discussion