10.4.7 Пределы числа столбцов таблицы и размера строк
В этом разделе описаны пределы числа столбцов в таблицах и размера отдельных строк.
Пределы числа столбцов
MySQL имеет жёсткий предел в 4096 столбцов на таблицу, но фактический максимум может быть меньше для конкретной таблицы. Точное ограничение на число столбцов зависит от нескольких факторов:
Максимальный размер строки для таблицы ограничивает количество (и, возможно, размер) столбцов, поскольку общая длина всех столбцов не может превышать этот размер. См. Пределы размера строк.
Требования к хранению отдельных столбцов ограничивают количество столбцов, которые могут поместиться в заданном максимальном размере строки. Требования к хранению для некоторых типов данных зависят от таких факторов, как движок хранения, формат хранения и кодовая страница. См. Раздел 13.7, «Требования к хранению типов данных».
Движки хранения могут накладывать дополнительные ограничения, которые ограничивают количество столбцов таблицы. Например,
InnoDBимеет ограничение в 1017 столбцов на таблицу. См. Раздел 17.21, «Пределы InnoDB». Для получения информации об других движках хранения см. Главу 18, Альтернативные движки хранения.Функциональные части ключей (см. Раздел 15.1.15, «Выражение CREATE INDEX») реализуются как скрытые виртуальные сгенерированные хранимые столбцы, поэтому каждая функциональная часть ключа в индексе таблицы учитывается в общем пределе столбцов таблицы.
Пределы размера строк
Максимальный размер строки для данной таблицы определяется несколькими факторами:
Внутреннее представление таблицы MySQL имеет максимальный размер строки в 65 535 байт, даже если движок хранения может поддерживать строки большего размера.
BLOBиTEXTстолбцы вносят только 9–12 байт в предел размера строки, поскольку их содержимое хранится отдельно от остальной части строки.-
Максимальный размер строки для таблицы
InnoDB, которая применяется к данным, хранящимся локально на странице базы данных, немного меньше половины страницы для 4КБ, 8КБ, 16КБ и 32КБinnodb_page_sizeнастроек. Например, максимальный размер строки немного меньше 8 КБ для значения по умолчанию в 16 КБInnoDBразмера страницы. Для страниц 64 КБ максимальный размер строки немного меньше 16 КБ. См. Раздел 17.21, «Пределы InnoDB».Если строка, содержащая превышает
InnoDBмаксимальный размер строки,InnoDBвыбирает столбцы переменной длины для внешнего хранения вне страницы, пока строка не поместится вInnoDBпредел размера строки. Количество данных, хранящихся локально для столбцов переменной длины, хранящихся вне страницы, отличается в зависимости от формата строки. Дополнительную информацию см. в Разделе 17.10, «Форматы строк InnoDB». -
Различные форматы хранения используют разные объёмы данных заголовка и трейлера страницы, что влияет на объём памяти, доступный для строк.
Для получения информации о
InnoDBформатах строк см. Раздел 17.10, «Форматы строк InnoDB».Для получения информации о
MyISAMформатах хранения см. Раздел 18.2.3, «Форматы хранения таблиц MyISAM».
Примеры пределов размера строк
-
Максимальный предел размера строки MySQL в 65 535 байт демонстрируется в следующих
InnoDBиMyISAMпримерах. Ограничение применяется независимо от движка хранения, даже если движок хранения может поддерживать строки большего размера.mysql>
CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),f VARCHAR(10000), g VARCHAR(6000)) ENGINE=InnoDB CHARACTER SET latin1;ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBsmysql>
CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),f VARCHAR(10000), g VARCHAR(6000)) ENGINE=MyISAM CHARACTER SET latin1;ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBsВ следующем
MyISAMпримере изменение столбца наTEXTпозволяет избежать ограничения размера строки в 65 535 байт и позволяет выполнить операцию, посколькуBLOBиTEXTстолбцы вносят только 9–12 байт в предел размера строки.mysql>
CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),f VARCHAR(10000), g TEXT(6000)) ENGINE=MyISAM CHARACTER SET latin1;Query OK, 0 rows affected (0.02 sec)Операция выполняется для таблицы
InnoDB, поскольку изменение столбца наTEXTпозволяет избежать ограничения размера строки MySQL в 65 535 байт, аInnoDBвнешнее хранение столбцов переменной длины позволяет избежатьInnoDBограничения размера строки.mysql>
CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),f VARCHAR(10000), g TEXT(6000)) ENGINE=InnoDB CHARACTER SET latin1;Query OK, 0 rows affected (0.02 sec) -
Хранение для столбцов переменной длины включает байты длины, которые учитываются в размере строки. Например, столбец
VARCHAR(255) CHARACTER SET utf8mb3занимает два байта для хранения длины значения, поэтому каждое значение может занимать до 767 байт.Запрос на создание таблицы
t1успешно выполняется, поскольку столбцы требуют 32 765 + 2 байта и 32 766 + 2 байта, что находится в пределах максимального размера строки в 65 535 байт:mysql>
CREATE TABLE t1(c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL)ENGINE = InnoDB CHARACTER SET latin1;Query OK, 0 rows affected (0.02 sec)Запрос на создание таблицы
t2завершается ошибкой, поскольку, хотя длина столбца находится в пределах максимальной длины в 65 535 байт, для записи длины необходимо два дополнительных байта, что приводит к превышению размера строки 65 535 байт:mysql>
CREATE TABLE t2(c1 VARCHAR(65535) NOT NULL)ENGINE = InnoDB CHARACTER SET latin1;ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBsСокращение длины столбца до 65 533 или меньше позволяет выполнить запрос успешно.
mysql>
CREATE TABLE t2(c1 VARCHAR(65533) NOT NULL)ENGINE = InnoDB CHARACTER SET latin1;Query OK, 0 rows affected (0.01 sec) -
Для таблиц
MyISAMстолбцыNULLтребуют дополнительного места в строке для записи того, являются ли их значенияNULL. Каждый столбецNULLзанимает один дополнительный бит, округлённый до ближайшего байта.Запрос на создание таблицы
t3завершается ошибкой, посколькуMyISAMтребует места дляNULLстолбцов в дополнение к месту, необходимому для байтов длины столбцов переменной длины, что приводит к превышению размера строки 65 535 байт:mysql>
CREATE TABLE t3(c1 VARCHAR(32765) NULL, c2 VARCHAR(32766) NULL)ENGINE = MyISAM CHARACTER SET latin1;ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBsДля получения информации о
InnoDBNULLхранении столбцов см. Раздел 17.10, «Форматы строк InnoDB». -
InnoDBограничивает размер строки (для данных, хранящихся локально на странице базы данных) немного меньше половины страницы базы данных для 4КБ, 8КБ, 16КБ и 32КБinnodb_page_sizeнастроек и немного меньше 16КБ для 64КБ страниц.Запрос на создание таблицы
t4завершается ошибкой, поскольку определённые столбцы превышают предел размера строки для 16КБInnoDBстраницы.mysql>
CREATE TABLE t4 (c1 CHAR(255),c2 CHAR(255),c3 CHAR(255),c4 CHAR(255),c5 CHAR(255),c6 CHAR(255),c7 CHAR(255),c8 CHAR(255),c9 CHAR(255),c10 CHAR(255),c11 CHAR(255),c12 CHAR(255),c13 CHAR(255),c14 CHAR(255),c15 CHAR(255),c16 CHAR(255),c17 CHAR(255),c18 CHAR(255),c19 CHAR(255),c20 CHAR(255),c21 CHAR(255),c22 CHAR(255),c23 CHAR(255),c24 CHAR(255),c25 CHAR(255),c26 CHAR(255),c27 CHAR(255),c28 CHAR(255),c29 CHAR(255),c30 CHAR(255),c31 CHAR(255),c32 CHAR(255),c33 CHAR(255)) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARSET latin1;ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
© 2025 Oracle
Licensed under the GPLv2 License.