Spec-Zone.ru › MySQL 8.4

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 BLOBs
    
    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=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
    

    Для получения информации о InnoDB NULL хранении столбцов см. Раздел 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/column-count-limit.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API