Spec-Zone .ru
спецификации, руководства, описания, API

11.6. Требования Хранения Типа данных

Требования хранения для табличных данных на диске зависят от нескольких факторов. Различные механизмы хранения представляют типы данных и хранят необработанные данные по-другому. Табличные данные могли бы быть сжаты, или для столбца или для всей строки, усложняя вычисление требований хранения для таблицы или столбца.

Несмотря на различия в расположении хранения на диске, внутренние API MySQL, которые передают и обмениваются информацией о строках таблицы, используют непротиворечивую структуру данных, которая применяется через все механизмы хранения.

Этот раздел включает направляющие линии и информацию для требований хранения для каждого типа данных, поддерживаемого MySQL, включая внутренний формат и размер для механизмов хранения, которые используют представление фиксированного размера для типов данных. Информация перечисляется по категориям или механизм хранения.

У внутреннего представления таблицы есть максимальный размер строки 65 535 байтов, даже если механизм хранения способен к поддержке более крупных строк. Это число исключает BLOB или TEXT столбцы, которые вносят только 9 - 12 байтов к этому размеру. Для BLOB и TEXT данные, информация хранится внутренне в различной области памяти чем буфер строк. Различные механизмы хранения обрабатывают выделение и хранение этих данных по-разному согласно методу, который они используют для того, чтобы обработать соответствующие типы. Для получения дополнительной информации см. Главу 14, Механизмы Хранения, и Раздел E.10.4, "Пределы на Столбце таблицы граф и Размер Строки".

InnoDB Таблицы

См. Раздел 14.2.3.12.7, "Физическая Структура Строки" для информации о требованиях хранения для InnoDB таблицы.

NDBCLUSTER Таблицы

Важный

NDB таблицы используют 4-байтовое выравнивание; все NDB хранение данных делается в сети магазинов 4 байтов. Таким образом значение столбца, которое обычно брало бы 15 байтов, требует 16 байтов в NDB таблица. Например, в NDB таблицы, TINYINT, SMALLINT, MEDIUMINT, и INTEGER (INT) столбец вводит, каждый требует 4-байтового хранения на запись из-за фактора выравнивания.

Каждый BIT(M) столбец берет M биты пространства памяти. Хотя человек BIT столбец не составляет выровненные 4 байта, NDB резервы 4 байта (32 бита) на строку для первых 1-32 битов, необходимых для BIT столбцы, тогда еще 4 байта для битов 33-64, и так далее.

В то время как a NULL непосредственно не требует никакого пространства памяти, NDB резервные 4 байта за строку, если табличное определение содержит какие-либо столбцы, определенные как NULL, до 32 NULL столбцы. (Если таблица MySQL Cluster определяется с помощью больше чем 32 NULL столбцы 64 NULL столбцы, тогда 8 байтов за строку резервируются.)

Каждая таблица, используя NDB механизм хранения требует первичного ключа; если Вы не определяете первичный ключ, "скрытый" первичный ключ создается NDB. Этот скрытый первичный ключ использует запись 31-35 байтов за таблицу.

Можно использовать ndb_size.pl сценарий Perl, чтобы оценить NDB требования хранения. Это соединяет с текущим MySQL (не MySQL Cluster) базу данных и создает отчет относительно того, сколько пространства, которого потребовала бы база данных, если бы это использовало NDB механизм хранения. См. Раздел 17.4.23, "ndb_size.pl — Оценочная функция Требования Размера NDBCLUSTER" для получения дополнительной информации.

Требования хранения для Числовых Типов

Тип данных Необходимое хранение
TINYINT 1 байт
SMALLINT 2 байта
MEDIUMINT 3 байта
INT, INTEGER 4 байта
BIGINT 8 байтов
FLOAT(p) 4 байта, если 0 <= p <= 24, 8 байтов, если 25 <= p <= 53
FLOAT 4 байта
DOUBLE [PRECISION], REAL 8 байтов
DECIMAL(M,D),NUMERIC(M,D) Изменяется; см. следующее обсуждение
BIT(M) приблизительно (M+7) Байты/8

Значения для DECIMALNUMERIC) столбцы представляются, используя двоичный формат, который упаковывает девять десятичных чисел (базируйтесь 10), цифры в четыре байта. Хранение для целых и дробных частей каждого значения определяется отдельно. Каждое кратное число девяти цифр требует четырех байтов, и "оставшиеся" цифры требуют некоторой части четырех байтов. Хранение, требуемое для избыточных цифр, дается следующей таблицей.

Оставшиеся Цифры Число Байтов
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 упаковывается более эффективно, требуя 5 а не 8 байтов для недробной части, и у всех трех частей есть дробная часть, которая требует от 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: Важные Алгоритмы и Структуры.

Требования хранения для Строковых Типов

В следующей таблице, M представляет объявленную длину столбца в символах для типов недвоичной строки и байтах для типов двоичной строки. L представляет фактическую длину в байтах данного строкового значения.

Тип данных Необходимое хранение
CHAR(M) M × w байты, 0 <= M <= 255, где w число байтов, требуемых для символа максимально-длиной в наборе символов
BINARY(M) M байты, 0 <= M <= 255
VARCHAR(M), VARBINARY(M) L + 1 байт, если значения столбцов требуют 0 – 255 байтов, L + 2 байта, если значения могут потребовать больше чем 255 байтов
TINYBLOB, TINYTEXT L + 1 байт, где L < 28
BLOB, TEXT L + 2 байта, где L < 216
MEDIUMBLOB, MEDIUMTEXT L + 3 байта, где L < 224
LONGBLOB, LONGTEXT L + 4 байта, где L < 232
ENUM('value1','value2',...) 1 или 2 байта, в зависимости от числа перечислимых величин (65 535 максимумов значений)
SET('value1','value2',...) 1, 2, 3, 4, или 8 байтов, в зависимости от числа элементов множества (64members максимум)

Типы строки переменной длины сохранены, используя префикс длины плюс данные. Префикс длины требует от одного до четырех байтов в зависимости от типа данных, и значение префикса L (длина байта строки). Например, хранение для a MEDIUMTEXT значение требует L байты, чтобы сохранить значение плюс три байта, чтобы сохранить длину значения.

Вычислить число байтов, используемых, чтобы сохранить деталь CHAR, VARCHAR, или TEXT значение столбца, следует принять во внимание набор символов, используемый для того столбца и содержит ли значение многобайтовые символы. В частности при использовании utf8 (или utf8mb4) Набор символов Unicode, следует иметь в виду, что не все символы используют то же самое число байтов и могут потребовать до трех (четыре) байты на символ. Для отказа хранения, используемого для различных категорий utf8 или utf8mb4 символы, см. Раздел 10.1.10, "Поддержка Unicode".

VARCHAR, VARBINARY, и BLOB и TEXT типы являются типами переменной длины. Для каждого требования хранения зависят от этих факторов:

Например, a VARCHAR(255) столбец может содержать строку с максимальной длиной 255 символов. Предположение, что столбец использует latin1 набор символов (один байт за символ), фактическое требуемое хранение является длиной строки (L), плюс один байт, чтобы записать длину строки. Для строки 'abcd', L 4, и требование хранения составляет пять байтов. Если тот же самый столбец, как вместо этого объявляют, использует ucs2 двухбайтовый набор символов, требование хранения составляет 10 байтов: длина 'abcd' восемь байтов, и столбец требует, чтобы два байта сохранили длины, потому что максимальная длина больше чем 255 (до 510 байтов).

Эффективное максимальное количество байтов, которые могут быть сохранены в a VARCHAR или VARBINARY столбец подвергается максимальному размеру строки 65 535 байтов, который совместно используется среди всех столбцов. Для a VARCHAR столбец, который хранит многобайтовые символы, эффективное максимальное количество символов, меньше. Например, utf8 символы могут потребовать до трех байтов за символ, таким образом, a VARCHAR столбец, который использует utf8 набор символов, как могут объявлять, является максимумом 21 844 символов. См. Раздел E.10.4, "Пределы на Столбце таблицы граф и Размер Строки".

NDB механизм хранения поддерживает переменные-width столбцы. Это означает это a VARCHAR столбец в таблице MySQL Cluster требует того же самого количества хранения, как был бы любой другой механизм хранения, за исключением того, что такие значения составляют выровненные 4 байта. Таким образом, строка 'abcd' сохраненный в a VARCHAR(50) столбец используя latin1 набор символов требует 8 байтов (а не 6 байтов для того же самого значения столбца в a MyISAM таблица).

TEXT и BLOB столбцы реализуются по-другому в NDB механизм хранения, в чем каждая строка в a TEXT столбец составляется из двух отдельных частей. Один из них имеет фиксированный размер (256 байтов), и фактически сохранен в исходной таблице. Другой состоит из любых данных сверх 256 байтов, которые хранятся в скрытой таблице. Строки в этой второй таблице всегда 2 000 байтов длиной. Это означает что размер a TEXT столбец 256 если size <= 256 (где size представляет размер строки); иначе, размер 256 + size + (2000 – (size – 256) % 2000).

Размер ENUM объект определяется числом различных перечислимых величин. Один байт используется для перечислений с 255 возможными значениями. Два байта используются для наличия перечислений между 256 и 65 535 возможными значениями. См. Раздел 11.4.4," ENUM Введите".

Размер a SET объект определяется числом различных элементов множества. Если размер набора N, объект занимает (N+7)/8 байты, окруженные к 1, 2, 3, 4, или 8 байтов. A SET может иметь максимум 64 элементов. См. Раздел 11.4.5," SET Введите".