MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  データ型  /  データ型のストレージ要件

11.7 データ型のストレージ要件

ディスク上のテーブルデータのストレージ要件は、複数の要因によって異なります。 別々のストレージエンジンは異なる方法でデータ型を表し、ローデータを格納します。 カラムか行全体のどちらかでテーブルデータを圧縮できますが、テーブルまたはカラムのストレージ要件の計算が複雑になります。

ディスク上のストレージレイアウトが違っていても、テーブル行に関する情報を通信および交換する内部 MySQL API は、すべてのストレージエンジンにわたって適用される一貫したデータ構造を使用します。

このセクションでは、データ型の固定サイズ表現を使用するストレージエンジンの内部形式およびサイズを含め、MySQL がサポートするデータ型ごとのストレージ要件に関するガイドラインおよび情報について説明します。 情報はカテゴリまたはストレージエンジンごとに示します。

テーブルの内部表現の最大行サイズは 65,535 バイトであり、ストレージエンジンがこれ以上のサイズの行をサポートできる場合でもこのサイズになります。 BLOB または TEXT カラムはこのサイズに 9 から 12 バイトしか関与しないので、これらのカラムはこのサイズに含まれません。 BLOB および TEXT データについての情報は、行バッファーとは異なるメモリー領域に内部的に格納されます。 それぞれのストレージエンジンは、対応する型の処理に使用する方法に従って異なる方法で、このデータの割り当ておよびストレージを扱います。 詳細は、第16章「代替ストレージエンジンおよびセクション8.4.7「テーブルカラム数と行サイズの制限」を参照してください。

InnoDB テーブルの記憶域要件

InnoDB テーブルのストレージ要件の詳細は、セクション15.10「InnoDB の行フォーマット」を参照してください。

NDB テーブルのストレージ要件

重要

NDB テーブルは、4 バイトアライメントを使用します。すべての NDB データストレージは、4 バイトの倍数で行われます。 したがって、通常であれば 15 バイトを使用するカラム値は、NDB テーブルでは 16 バイトを必要とします。 たとえば、NDB テーブルでは、TINYINTSMALLINTMEDIUMINT、および INTEGER (INT) カラム型はそれぞれ、アライメント係数により、レコードあたり 4 バイトのストレージが必要になります。

BIT(M) カラムは M ビットのストレージ領域を使用します。 各 BIT カラムは 4 バイトアライメントが行われていませんが、NDB は、BIT カラムに必要な最初の 1 から 32 ビットに行あたり 4 バイト (32 ビット) を、33 から 64 ビットに別の 4 ビットを、というように予約します。

NULL 自体には記憶域領域は必要ありませんが、テーブル定義に NULL を許可するカラムが含まれている場合、NDB は行ごとに最大 32 の NULL カラムを予約します。 (「NDB Cluster」テーブルに 32 を超える NULL カラムが定義されている場合、行当たり 8 バイトが予約されます。)

NDB ストレージエンジンを使用するすべてのテーブルで主キーが必要になります。主キーを定義していない場合、非表示の主キーが NDB によって作成されます。 この非表示の主キーはテーブルレコードあたり 31 から 35 バイトを消費します。

ndb_size.pl Perl スクリプトを使用して、NDB ストレージ要件を評価します。 現在の MySQL (NDB Cluster ではない) データベースに接続し、データベースが NDB ストレージエンジンを使用した場合に必要となる領域の量に関するレポートを作成します。 詳細は、セクション23.4.28「ndb_size.pl — NDBCLUSTER サイズ要件エスティメータ」を参照してください。

数値型の記憶域要件

データ型 必要なストレージ
TINYINT 1 バイト
SMALLINT 2 バイト
MEDIUMINT 3 バイト
INTINTEGER 4 バイト
BIGINT 8 バイト
FLOAT(p) 0 <= p <= 24 の場合は 4 バイト、25 <= p <= 53 の場合は 8 バイト
FLOAT 4 バイト
DOUBLE [PRECISION]REAL 8 バイト
DECIMAL(M,D)NUMERIC(M,D) 変動; 次の説明を参照
BIT(M) 約 (M+7)/8 バイト

DECIMAL (および NUMERIC) カラムの値は、9 桁の 10 進数 (10 進法) を 4 バイトにパックするバイナリ形式を使用して表現されます。 各値の整数部と小数部のストレージは、個別に決定されます。 9 桁の倍ごとに 4 バイトが必要であり、余りの桁には 4 バイトのうちの一部が必要です。 余りの桁に必要なストレージ要件を次の表に示します。

余りの桁 バイト数
0 0
1 1
2 1
3 2
4 2
5 3
6 3
7 4
8 4

日時型の格納要件

TIMEDATETIME、および TIMESTAMP カラムの場合、MySQL 5.6.4 よりも前に作成されたテーブルに必要なストレージは、5.6.4 以降で作成されたテーブルとは異なります。 これは、5.6.4 で、0 から 3 バイトを必要とする小数部をこれらの型が持つことを許可するように変更されたためです。

データ型 MySQL 5.6.4 より前で必要なストレージ MySQL 5.6.4 以降で必要なストレージ
YEAR 1 バイト 1 バイト
DATE 3 バイト 3 バイト
TIME 3 バイト 3 バイト + 小数秒ストレージ
DATETIME 8 バイト 5 バイト + 小数秒ストレージ
TIMESTAMP 4 バイト 4 バイト + 小数秒ストレージ

MySQL 5.6.4 以降、YEAR および DATE のストレージは変更ありません。 ただし、TIMEDATETIME、および TIMESTAMP は異なって表現されます。 DATETIME はより効率的にパックされ、非小数部に必要なバイト数は 8 バイトではなく 5 バイトであり、3 つの部分すべてに、格納値の小数秒精度に応じて 0 から 3 バイトが必要な小数部があります。

小数秒精度 必要なストレージ
0 0 バイト
1、2 1 バイト
3、4 2 バイト
5、6 3 バイト

たとえば、TIME(0)TIME(2)TIME(4)、および TIME(6) はそれぞれ 3、4、5、6 バイトを使用します。 TIMETIME(0) は同等で、必要なストレージは同じです。

時間値の内部表現の詳細は、「MySQL Internals: Important Algorithms and Structures」を参照してください。

文字列型の格納要件

次の表では、M は宣言されたカラムの長さを、非バイナリ文字列型の場合は文字数で、バイナリ文字列型の場合はバイト数で表します。 L は指定された文字列値の実際の長さをバイト数で表します。

データ型 必要なストレージ
CHAR(M) InnoDB 行形式のコンパクトファミリは、可変長文字セットの記憶域を最適化します。 COMPACT 行形式の格納特性を参照してください。 それ以外の場合は、M× w バイト、<= M <= 255。ここで、w は、文字セット内の最大長文字に必要なバイト数です。
BINARY(M) M バイト、0 <= M <= 255
VARCHAR(M)VARBINARY(M) カラム値が 0 から 255 バイトを必要とする場合は、L + 1 バイト、値が 255 バイト以上を必要とする可能性のある場合は、L + 2 バイト
TINYBLOBTINYTEXT L + 1 バイト、ここで L < 28
BLOBTEXT L + 2 バイト、ここで L < 216
MEDIUMBLOBMEDIUMTEXT L + 3 バイト、ここで L < 224
LONGBLOBLONGTEXT L + 4 バイト、ここで L < 232
ENUM('value1','value2',...) 列挙値の数 (最大 65,535 個の値) により 1 または 2 バイト
SET('value1','value2',...) セットメンバーの数 (最大 64 メンバー) により、1、2、3、4、または 8 バイト

可変長の文字列型は、長さプリフィクスが付いたデータを使用して格納されます。 長さプリフィクスにはデータ型に応じて 1 から 4 バイトが必要で、プリフィクスの値は L (文字列のバイト長) です。 たとえば、MEDIUMTEXT 値のストレージには、値を格納するための L バイトに加えて、値の長さを格納するための 3 バイトが必要です。

特定の CHARVARCHAR、または TEXT カラム値の格納に使用されるバイト数を計算するには、そのカラムに使用される文字セットと、値にマルチバイト文字が含まれるかどうかを考慮する必要があります。 特に、utf8 Unicode 文字セットを使用する場合は、すべての文字が同じバイト数を使用するわけではないことに注意する必要があります。utf8mb3 および utf8mb4 の文字セットには、それぞれ最大 3 バイトと 4 バイトが必要です。 様々なカテゴリの utf8mb3 または utf8mb4 文字に使用される記憶域の内訳は、セクション10.9「Unicode のサポート」 を参照してください。

VARCHARVARBINARY、および BLOBTEXT 型は可変長型です。 それぞれのストレージ要件は次の要因によって決まります。

  • カラム値の実際の長さ

  • カラムの可能な最大の長さ

  • カラムに使用される文字セット。一部の文字セットにはマルチバイト文字が含まれるため。

たとえば、VARCHAR(255) カラムには最大 255 文字の長さの文字列を格納できます。 そのカラムが latin1 文字セット (1 文字あたり 1 バイト) を使用すると仮定すると、実際に必要なストレージは文字列の長さ (L) に、文字列の長さを記録するための 1 バイトを加えた大きさとなります。 文字列 'abcd' の場合、L は 4 で、ストレージ要件は 5 バイトになります。 同じカラムが代わりにダブルバイト文字セット ucs2 を使用するように宣言されている場合、ストレージ要件は 10 バイトになります。'abcd' の長さは 8 バイトで、カラムの最大長が 255 よりも大きい (最大 510 バイト) ため、長さを格納するために 2 バイト必要になります。

VARCHAR または VARBINARY カラムに格納できる有効な最大バイト数は最大行サイズ (65,535 バイト、すべてのカラムで共有される) によって決まります。 複数バイト文字を格納する VARCHAR カラムの場合、文字の有効な最大数は少なくなります。 たとえば、utf8mb4 文字には文字ごとに最大 4 バイトが必要な場合があるため、utf8mb4 文字セットを使用する VARCHAR カラムは 16,383 文字まで宣言できます。 セクション8.4.7「テーブルカラム数と行サイズの制限」を参照してください。

InnoDB では、768 バイト以上の固定長フィールドが可変長フィールドとしてエンコードされ、オフページに格納できます。 たとえば、utf8mb4 と同様に、文字セットの最大バイト長が 3 より大きい場合、CHAR(255) カラムは 768 バイトを超えることがあります。

NDB ストレージエンジンは可変幅カラムをサポートします。 つまり、「NDB Cluster」テーブルの VARCHAR カラムには、ほかのストレージエンジンと同じ量のストレージが必要ですが、このような値が 4 バイトに整列されている点が異なります。 したがって、latin1 文字セットを使用して VARCHAR(50) カラムに格納された文字列 'abcd' は、(MyISAM テーブル内の同じカラム値に対する 5 バイトではなく) 8 バイトを必要とします。

NDB では、TEXT カラムと BLOB カラムは異なる方法で実装されます。TEXT カラムの各行は、2 つの部分で構成されます。 そのうちの 1 つは固定サイズ (256 バイト) で、実際に元のテーブルに格納されます。 もう 1 つは 256 バイトを超えるデータで構成され、非表示のテーブルに格納されます。 2 番目のテーブルの行の長さは常に 2000 バイトです。 これは、size <= 256 (size は行のサイズを表す) の場合、TEXT カラムのサイズが 256 であることを意味します。それ以外の場合、サイズは 256 + size + (2000 × (size − 256) % 2000) です。

ENUM オブジェクトのサイズは異なる列挙値の数によって決まります。 最大 255 の値を持つ列挙に 1 バイトが使用されます。 256 から 65,535 の値を持つ列挙に 2 バイトが使用されます。 セクション11.3.5「ENUM 型」を参照してください。

SET オブジェクトのサイズは異なるセットメンバーの数によって決まります。 セットサイズが N である場合、オブジェクトは 1、2、3、4、または 8 バイトに丸められた (N+7)/8 バイトを占めます。 SET は最大 64 メンバーを持つことができます。 セクション11.3.6「SET 型」を参照してください。

空間型の記憶域要件

MySQL では、SRID の後に WKB 表現の値が続くことを示す 4 バイトを使用してジオメトリ値が格納されます。 LENGTH() 関数は、値の格納に必要な領域をバイト単位で返します。

WKB および空間値の内部記憶域形式の詳細は、セクション11.4.3「サポートされる空間データ形式」 を参照してください。

JSON 記憶域の要件

一般に、JSON カラムの記憶域要件は、LONGBLOB または LONGTEXT カラムの場合とほぼ同じです。つまり、JSON ドキュメントによって消費される領域は、これらのいずれかの型のカラムに格納されるドキュメント文字列表現の場合とほぼ同じです。 ただし、JSON ドキュメントに格納されている個々の値のメタデータやディクショナリなど、バイナリエンコーディングによるオーバーヘッドがあります。 たとえば、JSON ドキュメントに格納されている文字列には、文字列の長さおよび格納されているオブジェクトまたは配列のサイズに応じて、4 から 10 バイトの追加記憶域が必要です。

また、MySQL では、max_allowed_packet の値より大きくできないように、JSON カラムに格納される JSON ドキュメントのサイズに制限が課されます。


関連キーワード:  バイト, ストレージ, カラム, 要件, テーブル, 格納, 文字, サイズ, NDB, 最大