14.9.1.2 Создание сжатых таблиц
Сжатые таблицы могут быть созданы в пространствах имен или в . Сжатие таблиц недоступно для InnoDB . Системное пространство имен (пространство 0, ) может содержать созданные пользователем таблицы, но также содержит внутренние системные данные, которые никогда не сжимаются. Таким образом, сжатие применяется только к таблицам (и индексам), хранящимся в пространствах имен на основе файла на таблицу или общих пространствах имен.
Создание сжатой таблицы в пространстве имен на основе файла на таблицу
Для создания сжатой таблицы в пространстве имен на основе файла на таблицу, innodb_file_per_table должен быть включён (по умолчанию в MySQL 5.6.6) и innodb_file_format должен быть установлен на Barracuda. Вы можете установить эти параметры в файле конфигурации MySQL (my.cnf или my.ini) или динамически, используя оператор SET.
После того, как опции innodb_file_per_table и innodb_file_format настроены, укажите клаузу ROW_FORMAT=COMPRESSED или клаузу KEY_BLOCK_SIZE, или обе, в операторе CREATE TABLE или ALTER TABLE для создания сжатой таблицы в пространстве имен на основе файла на таблицу.
Например, вы можете использовать следующие операторы:
SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_file_format=Barracuda;
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 KEY_BLOCK_SIZE, должен быть равен FILE_BLOCK_SIZE/1024. Например, если innodb_page_size=16384 и FILE_BLOCK_SIZE=8192, размер страницы таблицы должен быть 8. Для получения дополнительной информации см. Раздел 14.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;
Примечания
Если вы указываете
ROW_FORMAT=COMPRESSED, вы можете опуститьKEY_BLOCK_SIZE; значениеKEY_BLOCK_SIZEпо умолчанию равно половине значенияinnodb_page_size.Если вы указываете допустимое значение
KEY_BLOCK_SIZE, вы можете опуститьROW_FORMAT=COMPRESSED; сжатие включается автоматически.Чтобы определить наилучшее значение для
KEY_BLOCK_SIZE,, обычно создают несколько копий одной и той же таблицы с различными значениями для этой клаузы, затем измеряют размер полученных файлов.ibdи видят, как каждый из них работает с реалистичным . Для общих пространств имен следует помнить, что удаление таблицы не уменьшает размер файла общего пространства имен.ibd, а также не возвращает место на диске операционной системе. Для получения дополнительной информации см. Раздел 14.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пространства имен. Для получения дополнительной информации см. Раздел 14.6.3.3, «Общие пространства имен».Размеры страниц 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, потому что такие значения часто сжимаются хорошо и, следовательно, могут потребовать меньше , как описано в Разделе 14.9.1.5, «Как работает сжатие для таблиц InnoDB». Для общих пространств имен значениеKEY_BLOCK_SIZE, равное размеру страницыInnoDB, не допускается. Для получения дополнительной информации см. Раздел 14.6.3.3, «Общие пространства имен».Все индексы таблицы (включая ) сжимаются с использованием одного и того же размера страницы, указанного в операторе
CREATE TABLEилиALTER TABLE. Атрибуты таблицы, такие какROW_FORMATиKEY_BLOCK_SIZE, не являются частью синтаксисаCREATE INDEXдляInnoDBтаблиц и игнорируются, если они указаны (хотя, если они указаны, они отображаются в выводе оператораSHOW CREATE TABLE).Для параметров конфигурации, связанных с производительностью, см. Раздел 14.9.1.3, «Настройка сжатия для таблиц InnoDB».
Ограничения на сжатые таблицы
Версии MySQL до 5.1 не могут обрабатывать сжатые таблицы.
Сжатые таблицы не могут храниться в
InnoDBсистемном пространстве имен.Общие пространства имен могут содержать несколько таблиц, но сжатые и несжатые таблицы не могут сосуществовать в одном общем пространстве имен.
Сжатие применяется ко всей таблице и всем связанным с ней индексам, а не к отдельным строкам, несмотря на название клаузы
ROW_FORMAT.
© 2025 Oracle
Licensed under the GPLv2 License.