11.7 데이터 유형의 스토리지 요구 사항
디스크 테이블 데이터 스토리지 요구 사항은 여러 요인에 따라 다릅니다. 서로 다른 스토리지 엔진은 다른 방법으로 데이터 형을 나타 로우 데이터를 저장합니다. 열이나 행 전체 중 하나로 테이블 데이터를 압축 할 수 있지만 테이블 또는 컬럼의 스토리지 요구 사항의 계산이 복잡해집니다.
디스크 스토리지 레이아웃이 달랐어도 테이블 행에 대한 정보를 통신 및 교환 할 내부 MySQL API는 모든 스토리지 엔진에 걸쳐 적용되는 일관된 데이터 구조를 사용합니다.
이 섹션에서는 데이터 형의 고정 크기 표현을 사용하는 스토리지 엔진의 내부 형식 및 크기를 포함하여 MySQL이 지원하는 데이터 형 당 스토리지 요구 사항에 대한 지침과 정보를 제공합니다. 정보는 카테고리 또는 스토리지 엔진에 대해 설명합니다.
테이블의 내부 표현의 최대 행 크기는 65,535 바이트이며, 스토리지 엔진이 더 이상 크기의 행을 지원하는 경우이 크기입니다. BLOB
또는 TEXT
컬럼이 크기에 9에서 12 바이트 밖에 관여하지 않기 때문에 이러한 열은이 크기에 포함되지 않습니다. BLOB
및 TEXT
데이터에 대한 정보는 행 버퍼와는 다른 메모리 영역에 내부적으로 저장됩니다. 각각의 스토리지 엔진은 해당 유형의 처리에 사용하는 방법에 따라 다른 방식으로이 데이터 할당 및 스토리지를 취급합니다. 자세한 내용은 15 장 "대체 스토리지 엔진 ' 및 섹션 D.10.4 "테이블 컬럼 및 행 크기 제한" 을 참조하십시오.
InnoDB 테이블의 스토리지 요구 사항
InnoDB
테이블의 스토리지 요구 사항의 자세한 내용은 섹션 14.2.13.7 "물리적 행 구조" 를 참조하십시오.
NDBCLUSTER 테이블의 스토리지 요구 사항
NDB
테이블은 4 바이트 정렬을 사용합니다. 모든 NDB
데이터 스토리지는 4 바이트의 배수로 이루어집니다. 따라서 보통이면 15 바이트를 사용하는 컬럼 값은 NDB
테이블에서는 16 바이트를 필요로합니다. 예를 들어, NDB
테이블은 TINYINT
, SMALLINT
, MEDIUMINT
및 INTEGER
( INT
) 컬럼 형은 각각 정렬 계수에 의해 레코드 당 4 바이트의 스토리지가 필요합니다.
각 BIT(
컬럼은 M
)M
비트의 저장 공간을 사용합니다. 각 BIT
컬럼은 4 바이트 정렬을하고 있지 않지만, NDB
는 BIT
컬럼에 필요한 첫 32 비트에 행 당 4 바이트 (32 비트)를 33에서 64 비트에 다른 4 비트를 등등 예약합니다.
NULL
자체 저장 공간을 필요로하지 않지만, NDB
테이블 정의에 NULL
로 정의 된 컬럼 (최대 32 개 NULL
컬럼)가 포함되는 경우, 행 당 4 바이트를 예약합니다. (MySQL Cluster 테이블이 32 이상의 NULL
컬럼에서 64 NULL
컬럼에 정의되어있는 경우, 행 당 8 바이트가 예약됩니다.)
NDB
스토리지 엔진을 사용하는 모든 테이블에 기본 키가 필요합니다. 기본 키를 정의하지 않는 경우 "숨겨진"기본 키가 NDB
에 의해 만들어집니다. 이 숨겨진 기본 키는 테이블 레코드 당 31에서 35 바이트를 소모합니다.
ndb_size.pl Perl 스크립트를 사용하여 NDB
스토리지 요구 사항을 평가합니다. 이것은 (MySQL Cluster가 아닌) 현재의 MySQL 데이터베이스에 연결하고 데이터베이스가 NDB
스토리지 엔진을 사용하는 경우에 얼마나 많은 공간을 필요로하는지에 대해보고합니다. 자세한 내용은 섹션 18.4.25 "ndb_size.pl - NDBCLUSTER 크기 요구 사항 추정기" 를 참조하십시오.
수치 형 스토리지 요구 사항
데이터 형 | 필요한 스토리지 |
---|---|
TINYINT | 1 바이트 |
SMALLINT | 2 바이트 |
MEDIUMINT | 3 바이트 |
INT , INTEGER | 4 바이트 |
BIGINT | 8 바이트 |
FLOAT ( | 0 <= p <= 24의 경우 4 바이트 25 <= p <= 53의 경우는 8 바이트 |
FLOAT | 4 바이트 |
DOUBLE [PRECISION] , REAL | 8 바이트 |
DECIMAL( , NUMERIC( | 변동; 다음의 설명을 참조 |
BIT ( | 약 ( 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 |
날짜와 시간 형 스토리지 요구 사항
TIME
, DATETIME
, 그리고 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
스토리지는 변경되지 않습니다. 그러나 TIME
, DATETIME
, 그리고 TIMESTAMP
는 다르게 표현됩니다. DATETIME
은보다 효율적으로 포장, 비 소수에 필요한 바이트는 8 바이트가 아닌 5 바이트이며, 세 부분 모두에 저장된 값의 소수 초 정도에 따라 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 바이트를 사용합니다. TIME
과 TIME(0)
은 동등하고, 필요한 스토리지는 동일합니다.
시간 값의 내부 표현 대한 자세한 내용은 " MySQL Internals : Important Algorithms and Structures "를 참조하십시오.
문자열의 스토리지 요구 사항
다음 표에서는 M
선언 된 컬럼의 길이를 비 바이너리 문자열의 경우는 문자에서 이진 문자열 형의 경우는 바이트 단위로 나타냅니다. L
은 지정된 문자열 값의 실제 길이를 바이트 단위로 나타냅니다.
데이터 형 | 필요한 스토리지 |
---|---|
CHAR ( | M × w 바이트, 0 <= 255 여기서 w 는 문자 집합의 최대 길이의 문자에 필요한 바이트 수입니다. InnoDB 테이블의 CHAR 데이터 유형의 스토리지 요구 사항의 자세한 내용은 섹션 14.2.13.7 "물리적 행 구조" 를 참조하십시오. |
BINARY ( | M 바이트, 0 <= 255 |
VARCHAR( , VARBINARY( | 컬럼 값이 0에서 255 바이트를 필요로하는 경우는 L + 1 바이트 값이 255 바이트 이상을 필요로 할 가능성이있는 경우는 L + 2 바이트 |
TINYBLOB , TINYTEXT | L + 1 바이트 여기에서 L <2 8 |
BLOB , TEXT | L + 2 바이트 여기에서 L <2 16 |
MEDIUMBLOB , MEDIUMTEXT | L + 3 바이트 여기에서 L <2 24 |
LONGBLOB , LONGTEXT | L + 4 바이트 여기에서 L <2 32 |
ENUM ( ' | 열거 값의 수 (최대 65,535 개의 값)에 의해 1 또는 2 바이트 |
SET ( ' | 세트 구성원의 수 (최대 64 멤버)에 의해 1,2,3,4 또는 8 바이트 |
가변 길이 문자열은 길이 접두어가 붙은 데이터를 사용하여 저장됩니다. 길이 프리픽스는 데이터 유형에 따라 1에서 4 바이트가 필요하며, 프리픽스의 값은 L
(문자열의 바이트)입니다. 예를 들어, MEDIUMTEXT
값 저장에 값을 저장하는 L
바이트 이외에 값의 길이를 저장하는 3 바이트가 필요합니다.
특정 CHAR
, VARCHAR
, 또는 TEXT
컬럼 값을 저장하는 데 사용되는 바이트 수를 계산하려면, 그 컬럼에 사용되는 문자 세트와 값에 멀티 바이트 문자가 포함되어 있는지 여부를 고려해야합니다 . 특히 utf8
(또는 utf8mb4
) Unicode 캐릭터 세트를 사용하는 경우 모든 문자 집합이 동일한 바이트를 사용하는 것은 아니고, 캐릭터 당 최대 3 (4) 바이트를 필요로하는 것은 아니라는 점에주의해야 수 있습니다. utf8
또는 utf8mb4
자가 다른 카테고리에 사용되는 스토리지의 자세한 내용은 섹션 10.1.10 "Unicode 지원" 을 참조하십시오.
VARCHAR
, VARBINARY
, 그리고 BLOB
와 TEXT
형은 가변 길이 형입니다. 각각의 스토리지 요구 사항은 다음의 요인에 의해 결정됩니다.
컬럼 값의 실제 길이
컬럼의 가능한 최대 길이
컬럼에 사용되는 문자 세트. 일부 문자 세트는 멀티 바이트 문자가 포함되어 있기 때문에.
예를 들어, VARCHAR(255)
컬럼은 최대 255 자 길이의 문자열을 저장할 수 있습니다. 그 열이 latin1
문자 세트 (문자 당 1 바이트)를 사용한다고 가정하면 실제 필요한 스토리지는 문자열의 길이 ( L
) 문자열의 길이를 기록하기 위해 1 바이트를 더한 값 크기입니다. 문자열 'abcd'
의 경우 L
은 4에서 스토리지 요구 사항은 5 바이트입니다. 같은 열이 대신 더블 바이트 문자 집합 ucs2
를 사용하도록 선언되어 있으면 스토리지 요구 사항은 10 바이트입니다. 'abcd'
의 길이는 8 바이트에서 컬럼의 최대 길이가 255보다 큰 (최대 510 바이트) 때문에 길이를 저장하는 2 바이트 필요합니다.
VARCHAR
또는 VARBINARY
컬럼에 저장할 수있는 유효한 최대 바이트 수는 최대 행 크기 (65,535 바이트 모든 컬럼에서 공유되는)에 의해 결정됩니다. 멀티 바이트 문자를 포함하는 VARCHAR
컬럼의 경우, 문자의 유효한 최대 수는 적습니다. 예를 들어, utf8
문자는 문자 당 최대 3 바이트를 필요로하는 경우가 있기 때문에 utf8
문자 집합을 사용하는 VARCHAR
컬럼은 최대 21,844 문자가되도록 선언 할 수 있습니다. 섹션 D.10.4 "테이블 컬럼 및 행 크기 제한" 을 참조하십시오.
NDB
스토리지 엔진은 가변 폭 컬럼을 지원합니다. 이것은 MySQL Cluster 테이블의 VARCHAR
컬럼이 같은 값에 대해 4 바이트 정렬이 이루어지는 점을 제외하면 다른 스토리지 엔진과 동일한 용량의 스토리지를 필요로한다는 것을 의미합니다. 따라서 latin1
문자 세트를 사용하여 VARCHAR(50)
컬럼에 저장된 문자열 'abcd'
는 ( MyISAM
테이블에서 동일한 컬럼 값에 대한 5 바이트가 아니라) 8 바이트를 필요로합니다.
TEXT
와 BLOB
컬럼은 NDB
스토리지 엔진은 다른 구현됩니다. 여기에서는 TEXT
컬럼의 각 행은 두 개의 부분으로 구성되어 있습니다. 그 중 하나는 고정 크기 (256 바이트)에서 실제로 원래의 테이블에 저장됩니다. 다른 하나는 256 바이트 이상의 데이터로 구성되어 숨겨진 테이블에 저장됩니다. 두 번째 테이블의 행의 길이는 항상 2,000 바이트입니다. 이것은 size
<= 256 (여기서 size
는 행의 크기를 나타냅니다)의 경우, TEXT
컬럼의 크기가 256이고, 그렇지 않으면 크기가 256 + size
+ (2000 - ( size
- 256) % 2000)임을 의미합니다.
ENUM
개체의 크기는 다른 열거 값의 수에 따라 결정됩니다. 255의 값을 가지는 열거에 1 바이트가 사용됩니다. 256에서 65,535의 값을 가지는 열거에 2 바이트가 사용됩니다. 섹션 11.4.4 "ENUM 형태" 를 참조하십시오.
SET
개체의 크기는 다른 세트 구성원의 수에 따라 결정됩니다. 세트 크기가 N
인 경우, 객체는 1,2,3,4 또는 8 바이트로 반올림 된 (
바이트를 차지합니다. N
+7)/8SET
는 최대 64 멤버를 가질 수 있습니다. 섹션 11.4.5 "SET 형" 을 참조하십시오.