Обзор форматов строк InnoDB
Двигатель хранения InnoDB поддерживает четыре различных формата строк:
В MariaDB 10.1 и ранее, два последних формата строк поддерживаются только если формат файла InnoDB Barracuda. Поэтому переменная системы innodb_file_format должна быть установлена в Barracuda для использования этих форматов строк в этих версиях.
В MariaDB 10.1 и ранее, два последних формата строк также поддерживаются только если таблица находится в пространстве имен file per-table. Поэтому переменная системы innodb_file_per_table должна быть установлена в ON для использования этих форматов строк в этих версиях.
Формат строки по умолчанию
Переменная системы innodb_default_row_format может использоваться для установки формата строки по умолчанию для таблиц InnoDB. Возможные значения:
-
redundant -
compact -
dynamic
Значение этой переменной по умолчанию — dynamic, что означает, что формат строки по умолчанию — DYNAMIC.
Эта переменная не может быть установлена в compressed, что означает, что формат строки по умолчанию не может быть COMPRESSED.
Например, следующие операторы создадут таблицу с форматом строки DYNAMIC:
SET SESSION innodb_strict_mode=ON; SET GLOBAL innodb_default_row_format='dynamic'; CREATE TABLE tab ( id int, str varchar(50) ) ENGINE=InnoDB;
Установка формата строки таблицы
Один из способов указать формат строки таблицы InnoDB — установить опцию таблицы ROW_FORMAT на соответствующий формат строки в операторе CREATE TABLE или ALTER TABLE. Например:
SET SESSION innodb_strict_mode=ON; SET GLOBAL innodb_file_per_table=ON; SET GLOBAL innodb_file_format='Barracuda'; CREATE TABLE tab ( id int, str varchar(50) ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
В MariaDB 10.1 и ранее, InnoDB может безмолвно игнорировать и перезаписывать некоторые варианты формата строки, если переменная системы innodb_file_format не установлена в Barracuda и переменная системы innodb_file_per_table не установлена в ON.
Проверка формата строки таблицы
Оператор SHOW TABLE STATUS можно использовать для просмотра формата строки, используемого таблицей. Например:
SHOW TABLE STATUS FROM db1 WHERE Name='tab'\G
*************************** 1. row ***************************
Name: tab
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2019-04-18 20:24:04
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options: row_format=DYNAMIC
Comment:
Также можно запросить таблицу information_schema.INNODB_SYS_TABLES для просмотра используемого формата строки таблицы. Например:
SELECT * FROM information_schema.INNODB_SYS_TABLES WHERE name='db1/tab'\G
*************************** 1. row ***************************
TABLE_ID: 42
NAME: db1/tab
FLAG: 33
N_COLS: 4
SPACE: 27
FILE_FORMAT: Barracuda
ROW_FORMAT: Dynamic
ZIP_PAGE_SIZE: 0
SPACE_TYPE: Single
Пространство имен таблицы помечено наименьшим форматом файла InnoDB, поддерживающим формат строки таблицы. Поэтому, даже если формат файла Barracuda включён, таблицы, использующие форматы строк COMPACT или REDUNDANT, будут помечены форматом файла Antelope в таблице information_schema.INNODB_SYS_TABLES.
Форматы строк
Формат строки REDUNDANT
Формат строки REDUNDANT — это оригинальный нескомпонованный формат строки.
Формат строки REDUNDANT был единственным доступным форматом строки до MySQL 5.0.3. В этом релизе этот формат строки был ретроактивно переименован в формат строки REDUNDANT. В том же релизе формат строки COMPACT был представлен как новый формат строки по умолчанию.
Для получения дополнительной информации см. Формат строки InnoDB REDUNDANT.
Формат строки COMPACT
Формат строки по умолчанию в MariaDB 10.2.1 и ранее COMPACT.
Формат строки COMPACT похож на формат строки REDUNDANT , но он хранит данные более компактно, что требует примерно на 20% меньше места для хранения.
Для получения дополнительной информации см. Формат строки InnoDB COMPACT.
Формат строки DYNAMIC
DYNAMIC является форматом строки по умолчанию.
Формат строки DYNAMIC похож на формат строки COMPACT , но таблицы, использующие формат строки DYNAMIC , могут хранить ещё больше данных на страницах с переполнением, чем таблицы, использующие формат строки COMPACT . Это приводит к более эффективному хранению данных, чем таблицы, использующие формат строки COMPACT , особенно для таблиц, содержащих столбцы, использующие типы данных VARBINARY, VARCHAR, BLOB и TEXT. Однако таблицы InnoDB, использующие формат строки COMPRESSED , более эффективны.
Для получения дополнительной информации см. Формат строки InnoDB DYNAMIC.
Формат строки COMPRESSED
Альтернативный способ сжатия таблиц InnoDB — использование Сжатие страниц InnoDB.
Формат строки COMPRESSED похож на формат строки COMPACT , но таблицы, использующие формат строки COMPRESSED , могут хранить ещё больше данных на страницах с переполнением, чем таблицы, использующие формат строки COMPACT . Это приводит к более эффективному хранению данных, чем таблицы, использующие формат строки COMPACT , особенно для таблиц, содержащих столбцы, использующие типы данных VARBINARY, VARCHAR, BLOB и TEXT.
Формат строки COMPRESSED также поддерживает сжатие всех страниц данных и индексов.
Для получения дополнительной информации см. Формат строки InnoDB COMPRESSED.
Максимальный размер строки
Несколько факторов помогают определить максимальный размер строки таблицы InnoDB.
Во-первых, MariaDB применяет ограничение в 65 535 байт на максимальный размер строки таблицы. Общий размер столбцов BLOB и TEXT таблицы не учитывается в этом лимите. В расчёт принимаются только указатели на столбцы BLOB и TEXT таблицы. MariaDB применяет это ограничение ко всем движкам хранения, поэтому это ограничение также применимо к таблицам InnoDB. Поэтому это ограничение является абсолютным максимальным размером строки для таблицы InnoDB.
Если вы попытаетесь создать таблицу, превышающую глобальное ограничение MariaDB на максимальный размер строки таблицы, то увидите ошибку следующего вида:
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 также есть собственные ограничения на максимальный размер строки, поэтому максимальный размер строки таблицы InnoDB может быть меньше глобального ограничения MariaDB.
Во-вторых, максимальный объём данных, которые таблица InnoDB может хранить в основной странице данных строки, зависит от значения переменной системы innodb_page_size. Максимальный объём данных, которые может потреблять одна строка на основной странице данных строки, составляет половину значения переменной системы innodb_page_size. При стандартном значении 16k, это означает, что одна строка может потреблять максимум около 8 КБ на основной странице данных строки. Однако предел основной страницы строки не является абсолютным пределом размера строки.
В-третьих, все форматы строк InnoDB могут хранить определённые типы данных на страницах переполнения, поэтому максимальный размер строки таблицы InnoDB может быть больше максимального объёма данных, который может быть сохранён на основной странице данных строки.
Некоторые форматы строк могут хранить больше данных на страницах переполнения, чем другие. Например, форматы строк DYNAMIC и COMPRESSED могут хранить наибольшее количество данных на страницах переполнения. Для получения информации о том, как определить, как различные форматы строк InnoDB могут использовать страницы переполнения, см. следующие разделы:
- Формат строки InnoDB REDUNDANT: Страницы переполнения с форматом строки REDUNDANT
- Формат строки InnoDB COMPACT: Страницы переполнения с форматом строки COMPACT
- Формат строки InnoDB DYNAMIC: Страницы переполнения с форматом строки DYNAMIC
- Формат строки InnoDB COMPRESSED: Страницы переполнения с форматом строки COMPRESSED
Если определение таблицы может допускать строки, которые таблица InnoDB не может фактически хранить, то InnoDB выведет ошибки или предупреждения в некоторых сценариях.
Если таблица использует форматы строк REDUNDANT или COMPACT , то ошибка или предупреждение будут следующими:
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
И если таблица использует форматы строк DYNAMIC или COMPRESSED , то ошибка или предупреждение будут следующими:
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.
Эти сообщения появляются в следующих случаях:
- Если строгий режим InnoDB включён и если выполняется оператор DDL, затрагивающий таблицу, такой как CREATE TABLE или ALTER TABLE, то InnoDB выведет ошибку с этим сообщением
- Если строгий режим InnoDB выключен и если выполняется оператор DDL, затрагивающий таблицу, такой как CREATE TABLE
or ALTER TABLE, то InnoDB выведет предупреждение с этим сообщением. - Независимо от того, включён ли строгий режим InnoDB, если выполняется оператор DML, который пытается записать строку, которую формат строки InnoDB таблицы не может хранить, то InnoDB выведет ошибку с этим сообщением.
Для получения информации о том, как решить проблему, см. Поиск и устранение ошибок «Размер строки слишком большой» в InnoDB.
Известные проблемы
Обновление приводит к ошибкам «Размер строки слишком большой»
До версий MariaDB 10.2.26, MariaDB 10.3.17 и MariaDB 10.4.7, MariaDB неправильно рассчитывал размер строк при выполнении DDL. В этих версиях можно было создать небезопасные таблицы, даже если был включен режим InnoDB strict mode. Расчёты были исправлены с помощью MDEV-19292 в MariaDB 10.2.26, MariaDB 10.3.17 и MariaDB 10.4.7.
В качестве побочного эффекта некоторые таблицы, которые могли быть созданы или изменены в предыдущих версиях, могут быть отклонены с следующей ошибкой в этих и более поздних версиях.
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.
А пользователи также могли увидеть следующее сообщение как ошибку или предупреждение в журнале ошибок:
[Warning] InnoDB: Cannot add field col in table db1.tab because after adding it, the row size is 8478 which is greater than maximum allowed size (8126) for a record on index leaf page.
InnoDB довольно долго использовал неправильные расчёты для определения размеров строк, поэтому многие пользователи могут неосознанно иметь небезопасные таблицы, которые фактически не могут быть сохранены в формате строк InnoDB.
В настоящее время InnoDB не предоставляет простого способа проверки существующих таблиц на эту проблему. См. MDEV-20400 для получения дополнительной информации.
Для получения информации о том, как решить эту проблему, см. Устранение неполадок ошибок «Размер строки слишком большой» с InnoDB.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/xtradbinnodb-storage-formats/