Spec-Zone.ru › MySQL 5.7

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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/innodb-compression-usage.html

Spec-Zone.ru

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