11.7 Требования к хранению типов данных
Требования к хранению данных таблиц на диске зависят от нескольких факторов. Разные хранилища данных представляют типы данных и хранят исходные данные по-разному. Данные таблицы могут быть сжаты, либо для столбца, либо для всей строки, что усложняет вычисление требований к хранению таблицы или столбца.
Несмотря на различия в организации данных на диске, внутренние API MySQL, которые взаимодействуют и обмениваются информацией о строках таблиц, используют согласованную структуру данных, применимую ко всем хранилищам данных.
Этот раздел содержит рекомендации и информацию о требованиях к хранению каждого типа данных, поддерживаемого MySQL, включая внутренний формат и размер для хранилищ данных, использующих фиксированный размер для представления типов данных. Информация приводится по категориям или хранилищу данных.
Внутреннее представление таблицы имеет максимальный размер строки 65535 байт, даже если хранилище данных способно поддерживать строки большего размера. Эта цифра не включает BLOB или TEXT столбцы, которые вносят лишь от 9 до 12 байт в этот размер. Для данных BLOB и TEXT информация хранится во внутренней области памяти, отличной от буфера строки. Разные хранилища данных обрабатывают выделение и хранение этих данных по-разному, в зависимости от используемого метода обработки соответствующих типов. Дополнительную информацию см. в Главе 15, Альтернативные хранилища данных и Разделе 8.4.7, «Ограничения на количество столбцов таблицы и размер строки».
Требования к хранению таблиц InnoDB
См. Раздел 14.11, «Форматы строк InnoDB» за информацией о требованиях к хранению InnoDB таблиц.
Требования к хранению таблиц NDB
Таблицы 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 и так далее.
Хотя сам NULL не требует места для хранения, NDB резервирует 4 байта на строку, если определение таблицы содержит столбцы, определённые как NULL, до 32 NULL столбцов. (Если таблица NDB Cluster определена с более чем 32 NULL столбцами до 64 NULL столбцов, то резервируется 8 байт на строку).
Каждая таблица, использующая хранилище NDB, требует первичного ключа; если вы не определили первичный ключ, NDB создаёт «скрытый» первичный ключ. Этот скрытый первичный ключ занимает от 31 до 35 байт на запись в таблице.
Вы можете использовать Perl-скрипт ndb_size.pl для оценки требований к хранению NDB. Он подключается к текущей базе данных MySQL (не NDB Cluster) и создаёт отчёт о том, сколько места потребовалось бы этой базе данных, если бы она использовала хранилище данных NDB. Дополнительную информацию см. в разделе 21.5.28, «ndb_size.pl — Оценка требований к размеру NDBCLUSTER».
Требования к хранению числовых типов данных
| Тип данных | Необходимое хранилище |
|---|---|
TINYINT | 1 байт |
SMALLINT | 2 байта |
MEDIUMINT | 3 байта |
INT, INTEGER
| 4 байта |
BIGINT | 8 байтов |
FLOAT( | 4 байта, если 0 <= p <= 24, 8 байтов, если 25 <= p <= 53 |
FLOAT | 4 байта |
DOUBLE [PRECISION], REAL
| 8 байтов |
DECIMAL(, NUMERIC(
| Переменное; см. нижеследующее обсуждение |
BIT( | приблизительно (M+7)/8 байтов |
Значения для столбцов DECIMAL (и NUMERIC) представляются с помощью двоичного формата, который упаковывает девять десятичных (основание 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( | Семейство компактных форматов строк InnoDB оптимизирует хранение для наборов символов переменной длины. См. Характеристики хранилища формата строк COMPACT. В противном случае, M × w байт, <=
255, где w — количество байт, необходимое для символа максимальной длины в наборе символов. |
BINARY( |
M байт, 0 <=
255 |
VARCHAR(, VARBINARY(
|
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(' | 1 или 2 байта, в зависимости от количества значений перечисления (максимум 65 535 значений) |
SET(' | 1, 2, 3, 4 или 8 байтов, в зависимости от количества элементов набора (максимум 64 элемента) |
Строки переменной длины хранятся с помощью префикса длины плюс данных. Префикс длины требует от одного до четырёх байтов в зависимости от типа данных, и значение префикса — L (длина строки в байтах). Например, хранение значения MEDIUMTEXT требует L байт для хранения значения плюс три байта для хранения длины значения.
Для расчёта количества байтов, используемых для хранения конкретного значения столбца CHAR, VARCHAR или TEXT, необходимо учитывать набор символов, используемый для этого столбца, и содержит ли значение многобайтовые символы. В частности, при использовании набора символов utf8 Unicode необходимо учитывать, что не все символы используют одинаковое количество байтов. utf8mb3 и utf8mb4 наборы символов могут потребовать до трёх и четырёх байтов на символ соответственно. Подробный разбор хранения для различных категорий utf8mb3 или utf8mb4 символов см. в Разделе 10.9 «Поддержка Unicode».
VARCHAR, VARBINARY и типы BLOB и TEXT являются типами переменной длины. Для каждого из них требования к хранению зависят от следующих факторов:
Фактическая длина значения столбца
Максимальная возможная длина столбца
Набор символов, используемый для столбца, так как некоторые наборы символов содержат многобайтовые символы
Например, столбец VARCHAR(255) может содержать строку максимальной длиной 255 символов. Предполагая, что столбец использует набор символов latin1 (один байт на символ), фактически требуемое хранение равно длине строки (L) плюс один байт для записи длины строки. Для строки 'abcd', L равно 4, и требования к хранению составляют пять байт. Если тот же столбец объявлен для использования двубайтового набора символов ucs2, требования к хранению составляют 10 байт: длина 'abcd' составляет восемь байт, и столбец требует два байта для хранения длин, так как максимальная длина превышает 255 (до 510 байт).
Эффективное максимальное количество байтов, которое может храниться в столбце VARCHAR или VARBINARY, ограничено максимальным размером строки в 65 535 байт, который делится между всеми столбцами. Для столбца VARCHAR, хранящего многобайтовые символы, эффективное максимальное количество символов меньше. Например, символы utf8mb3 могут потребовать до трёх байт на символ, поэтому столбец VARCHAR, использующий набор символов utf8mb3, может быть объявлен как максимум 21 844 символа. См. Раздел 8.4.7 «Ограничения на количество столбцов таблицы и размер строки».
InnoDB кодирует поля фиксированной длины, длина которых больше или равна 768 байтам, как поля переменной длины, которые могут храниться вне страницы. Например, столбец CHAR(255) может превышать 768 байт, если максимальная длина набора символов больше 3, как это происходит с utf8mb4.
Сетевой движок NDB поддерживает столбцы переменной ширины. Это означает, что столбец VARCHAR в таблице NDB Cluster требует такого же количества хранения, как и любой другой движок хранения, за исключением того, что такие значения выровнены по 4 байтам. Таким образом, строка 'abcd', хранящаяся в столбце VARCHAR(50) с использованием набора символов latin1, требует 8 байт (а не 5 байт для того же значения столбца в таблице MyISAM).
Столбцы TEXT, BLOB и JSON реализуются по-разному в сетевом движке NDB, где каждая строка в столбце состоит из двух отдельных частей. Одна из них имеет фиксированный размер (256 байт для TEXT и BLOB, 4000 байт для JSON) и фактически хранится в исходной таблице. Другая состоит из любых данных, превышающих 256 байт, которые хранятся в скрытой таблице частей blob. Размер строк в этой второй таблице определяется точным типом столбца, как показано в следующей таблице:
| Тип | Размер части BLOB |
|---|---|
BLOB, TEXT
| 2000 |
MEDIUMBLOB, MEDIUMTEXT
| 4000 |
LONGBLOB, LONGTEXT
| 13948 |
JSON | 8100 |
Это означает, что размер столбца TEXT равен 256, если size <= 256 (где size представляет размер строки); в противном случае размер равен 256 + size + (2000 × (size − 256) % 2000).
Части blob не хранятся отдельно в NDB для значений столбца TINYBLOB или TINYTEXT.
Вы можете увеличить размер части BLOB-столбца NDB до максимального значения 13948, используя NDB_COLUMN в комментарии к столбцу при создании или изменении родительской таблицы. Для получения дополнительной информации см. NDB_COLUMN Options.
Размер объекта ENUM определяется количеством различных значений перечисления. Один байт используется для перечислений с максимальным числом 255 возможных значений. Два байта используются для перечислений с числом возможных значений от 256 до 65 535. См. Раздел 11.3.5, «Тип ENUM».
Размер объекта SET определяется количеством различных элементов множества. Если размер множества равен N, объект занимает ( байт, округляя до 1, 2, 3, 4 или 8 байт. N+7)/8SET может содержать максимум 64 элемента. См. Раздел 11.3.6, «Тип SET».
Требования к хранению пространственных типов
MySQL хранит геометрические значения, используя 4 байта для указания SRID, за которым следует представление WKB значения. Функция LENGTH() возвращает количество байтов, необходимых для хранения значения.
Для описания форматов WKB и внутреннего хранения пространственных значений см. Раздел 11.4.3, «Поддерживаемые форматы пространственных данных».
Требования к хранению JSON
В общем случае требования к хранению столбца JSON примерно такие же, как и для столбца типа LONGBLOB или LONGTEXT; то есть, место, занимаемое JSON-документом, примерно такое же, как и при хранении строкового представления документа в столбце одного из этих типов. Однако существует дополнительная нагрузка, связанная с двоичным кодированием, включая метаданные и словари, необходимые для поиска отдельных значений, хранящихся в JSON-документе. Например, строка, хранящаяся в JSON-документе, требует от 4 до 10 дополнительных байтов памяти, в зависимости от длины строки и размера объекта или массива, в котором она хранится.
Кроме того, MySQL накладывает ограничение на размер любого JSON-документа, хранящегося в столбце типа JSON, которое не может превышать значение max_allowed_packet.
© 2025 Oracle
Licensed under the GPLv2 License.