17.9.1.2 Создание сжатых таблиц
Сжатые таблицы можно создавать в табличных пространствах или в . Сжатие таблиц недоступно для InnoDB . Системное табличное пространство (пространство 0, ) может содержать созданные пользователем таблицы, но также содержит внутренние системные данные, которые никогда не сжимаются. Таким образом, сжатие применяется только к таблицам (и индексам), хранящимся в табличных пространствах «на файл на таблицу» или общих табличных пространствах.
Создание сжатой таблицы в табличном пространстве «на файл на таблицу»
Для создания сжатой таблицы в табличном пространстве «на файл на таблицу» необходимо включить innodb_file_per_table (по умолчанию). Вы можете задать этот параметр в файле конфигурации MySQL (my.cnf или my.ini) или динамически, используя оператор SET.
После настройки параметра innodb_file_per_table укажите в операторе CREATE TABLE или ALTER TABLE предложение ROW_FORMAT=COMPRESSED или предложение KEY_BLOCK_SIZE, или оба, чтобы создать сжатую таблицу в табличном пространстве «на файл на таблицу».
Например, вы можете использовать следующие операторы:
SET GLOBAL innodb_file_per_table=1;
CREATE TABLE t1
(c1 INT PRIMARY KEY)
ROW_FORMAT=COMPRESSED
KEY_BLOCK_SIZE=8;
Создание сжатой таблицы в общем табличном пространстве
Чтобы создать сжатую таблицу в общем табличном пространстве, необходимо определить FILE_BLOCK_SIZE для общего табличного пространства, которое указывается при создании табличного пространства. Значение FILE_BLOCK_SIZE должно быть допустимым размером сжатой страницы по отношению к значению innodb_page_size, и размер страницы сжатой таблицы, определенный предложением CREATE TABLE или ALTER TABLE в операторе CREATE TABLE или ALTER TABLE KEY_BLOCK_SIZE, должен быть равен FILE_BLOCK_SIZE/1024. Например, если innodb_page_size=16384 и FILE_BLOCK_SIZE=8192, то KEY_BLOCK_SIZE таблицы должна быть 8. Дополнительную информацию см. в Разделе 17.6.3.3, «Общие табличные пространства».
Следующий пример демонстрирует создание общего табличного пространства и добавление сжатой таблицы. В примере предполагается значение по умолчанию innodb_page_size 16К. Значение FILE_BLOCK_SIZE 8192 требует, чтобы у сжатой таблицы был KEY_BLOCK_SIZE 8.
mysql> CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;
mysql> CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
Примечания
Начиная с MySQL 9.2, файл табличного пространства для сжатой таблицы создается с использованием физического размера страницы, а не
InnoDBразмера страницы, что делает начальный размер файла табличного пространства для пустой сжатой таблицы меньше, чем в предыдущих версиях MySQL.Если вы укажете
ROW_FORMAT=COMPRESSED, вы можете опуститьKEY_BLOCK_SIZE; значениеKEY_BLOCK_SIZEпо умолчанию составляет половину значенияinnodb_page_size.Если вы укажете допустимое значение
KEY_BLOCK_SIZE, вы можете опуститьROW_FORMAT=COMPRESSED; сжатие включается автоматически.Для определения наилучшего значения для
KEY_BLOCK_SIZE,, как правило, создают несколько копий одной и той же таблицы с различными значениями для этого предложения, затем измеряют размер полученных файлов.ibdи видят, как хорошо каждый из них работает с реалистичными данными. Для общих табличных пространств следует помнить, что удаление таблицы не уменьшает размер файла общего табличного пространства.ibd, а также не возвращает место на диске операционной системе. Дополнительную информацию см. в Разделе 17.6.3.3, «Общие табличные пространства».Значение
KEY_BLOCK_SIZEрассматривается как подсказка; необходимый размер может быть измененInnoDBпри необходимости. Для табличных пространств «на файл на таблицу» значениеKEY_BLOCK_SIZEможет быть меньше или равно значениюinnodb_page_size. Если вы укажете значение больше, чем значениеinnodb_page_size, указанное значение игнорируется, выводится предупреждение, аKEY_BLOCK_SIZEустанавливается в половину значенияinnodb_page_size. Еслиinnodb_strict_mode=ON, ввод некорректного значенияKEY_BLOCK_SIZEприводит к ошибке. Для общих табличных пространств допустимые значенияKEY_BLOCK_SIZEзависят от настройкиFILE_BLOCK_SIZEтабличного пространства. Дополнительную информацию см. в Разделе 17.6.3.3, «Общие табличные пространства».InnoDBподдерживает размеры страниц 32КБ и 64КБ, но эти размеры страниц не поддерживают сжатие. Дополнительную информацию см. в документацииinnodb_page_size.Значение по умолчанию для несжатых данных
InnoDBсоставляет 16КБ. В зависимости от сочетания значений параметров MySQL использует размер страницы 1КБ, 2КБ, 4КБ, 8КБ или 16КБ для файла данных табличного пространства (файл.ibd). Фактический алгоритм сжатия не зависит от значенияKEY_BLOCK_SIZE; значение определяет размер каждого сжатого фрагмента, что, в свою очередь, влияет на количество строк, которые можно упаковать в каждую сжатую страницу.При создании сжатой таблицы в табличном пространстве «на файл на таблицу» установка значения
KEY_BLOCK_SIZE, равного значениюInnoDB, как правило, не приводит к значительному сжатию. Например, установка значенияKEY_BLOCK_SIZE=16обычно не приведет к значительному сжатию, так как обычный размер страницыInnoDBсоставляет 16КБ. Это значение может быть полезным для таблиц с множеством длинных столбцовBLOB,VARCHARилиTEXT, так как такие значения часто хорошо сжимаются и, следовательно, могут потребовать меньше места, как описано в Разделе 17.9.1.5, «Как работает сжатие для таблиц InnoDB». Для общих табличных пространств значениеKEY_BLOCK_SIZE, равное значениюInnoDBразмера страницы, запрещено. Дополнительную информацию см. в Разделе 17.6.3.3, «Общие табличные пространства».Все индексы таблицы (включая ) сжимаются с использованием одного и того же размера страницы, как указано в операторе
CREATE TABLEилиALTER TABLE. Атрибуты таблицы, такие какROW_FORMATиKEY_BLOCK_SIZE, не являются частью синтаксисаCREATE INDEXдляInnoDBтаблиц и игнорируются, если они указаны (хотя, если они указаны, они отображаются в выводе оператораSHOW CREATE TABLE).Для параметров конфигурации, связанных с производительностью, см. Раздел 17.9.1.3, «Настройка сжатия для таблиц InnoDB».
Ограничения для сжатых таблиц
Сжатые таблицы не могут храниться в системном табличном пространстве
InnoDB.Общие табличные пространства могут содержать несколько таблиц, но сжатые и несжатые таблицы не могут сосуществовать в одном общем табличном пространстве.
Сжатие применяется ко всей таблице и всем связанным с ней индексам, а не к отдельным строкам, несмотря на название предложения
ROW_FORMAT.InnoDBне поддерживает сжатые временные таблицы. При включенномinnodb_strict_mode(по умолчанию), операторCREATE TEMPORARY TABLEвозвращает ошибки, если указаныROW_FORMAT=COMPRESSEDилиKEY_BLOCK_SIZE. Еслиinnodb_strict_modeотключен, выводится предупреждение, и временная таблица создается с использованием несжатого формата строк. Те же ограничения применяются к операциямALTER TABLEнад временными таблицами.
© 2025 Oracle
Licensed under the GPLv2 License.