Spec-Zone.ru › MySQL 5.7

14.9.2 Сжатие страниц InnoDB

InnoDB поддерживает сжатие страниц для таблиц, находящихся в табличных пространствах. Эта функция называется Прозрачное сжатие страниц. Сжатие страниц включается путем указания атрибута COMPRESSION с помощью CREATE TABLE или ALTER TABLE. Поддерживаемые алгоритмы сжатия включают Zlib и LZ4.

Поддерживаемые платформы

Для сжатия страниц требуется поддержка разреженных файлов и пробивки дыр. Сжатие страниц поддерживается в Windows с NTFS и в следующем подмножестве поддерживаемых MySQL Linux-платформ, где поддержка пробивки дыр обеспечивается на уровне ядра:

  • RHEL 7 и производные дистрибутивы, использующие ядро версии 3.10.0-123 или выше

  • OEL 5.10 (UEK2) ядро версии 2.6.39 или выше

  • OEL 6.5 (UEK3) ядро версии 3.8.13 или выше

  • OEL 7.0 ядро версии 3.8.13 или выше

  • SLE11 ядро версии 3.0-x

  • SLE12 ядро версии 3.12-x

  • OES11 ядро версии 3.0-x

  • Ubuntu 14.0.4 LTS ядро версии 3.13 или выше

  • Ubuntu 12.0.4 LTS ядро версии 3.2 или выше

  • Debian 7 ядро версии 3.2 или выше

Примечание

Не все доступные файловые системы для данного дистрибутива Linux могут поддерживать пробивку дыр.

Как работает сжатие страниц

При записи страницы она сжимается с использованием указанного алгоритма сжатия. Сжатые данные записываются на диск, где механизм пробивки дыр освобождает пустые блоки с конца страницы. Если сжатие не удается, данные записываются в исходном виде.

Размер пробивки дыр в Linux

В системах Linux размер блока файловой системы является единицей размера, используемой для пробивки дыр. Поэтому сжатие страниц работает только в том случае, если данные страницы можно сжать до размера, меньшего или равного размеру страницы InnoDB минус размер блока файловой системы. Например, если innodb_page_size=16K, а размер блока файловой системы составляет 4 КБ, данные страницы должны сжиматься до размера менее или равного 12 КБ, чтобы сделать пробивку дыр возможной.

Размер пробивки дыр в Windows

В системах Windows основой для разреженных файлов является сжатие NTFS. Размер пробивки дыр является единицей сжатия NTFS, которая в 16 раз больше размера кластера NTFS. Размеры кластеров и их единицы сжатия показаны в следующей таблице:

Таблица 14.8 Размер кластера Windows NTFS и единицы сжатия

Таблица 14.8 Размер кластера Windows NTFS и единицы сжатия
Размер кластера Единица сжатия
512 байт 8 КБ
1 КБ 16 КБ
2 КБ 32 КБ
4 КБ 64 КБ

Сжатие страниц в системах Windows работает только в том случае, если данные страницы можно сжать до размера, меньшего или равного размеру страницы InnoDB минус размер единицы сжатия.

Значение по умолчанию для размера кластера NTFS составляет 4 КБ, для которого размер единицы сжатия равен 64 КБ. Это означает, что сжатие страниц не приносит никакой пользы для стандартной конфигурации Windows NTFS, так как максимальное значение innodb_page_size также составляет 64 КБ.

Для работы сжатия страниц в Windows файловая система должна быть создана с размером кластера меньше 4 КБ, а innodb_page_size должно быть по меньшей мере вдвое больше размера единицы сжатия. Например, для работы сжатия страниц в Windows вы можете создать файловую систему с размером кластера 512 байт (который имеет единицу сжатия 8 КБ) и инициализировать InnoDB со значением innodb_page_size 16 КБ или больше.

Включение сжатия страниц

Для включения сжатия страниц укажите атрибут COMPRESSION в операторе CREATE TABLE. Например:

CREATE TABLE t1 (c1 INT) COMPRESSION="zlib";

Вы также можете включить сжатие страниц в операторе ALTER TABLE. Однако ALTER TABLE ... COMPRESSION обновляет только атрибут сжатия табличного пространства. Записи в табличное пространство, которые происходят после установки нового алгоритма сжатия, используют новое значение, но для применения нового алгоритма сжатия к существующим страницам необходимо перестроить таблицу с помощью OPTIMIZE TABLE.

ALTER TABLE t1 COMPRESSION="zlib";
OPTIMIZE TABLE t1;

Отключение сжатия страниц

Для отключения сжатия страниц установите COMPRESSION=None с помощью ALTER TABLE. Записи в табличное пространство, которые происходят после установки COMPRESSION=None, больше не используют сжатие страниц. Чтобы разархивировать существующие страницы, необходимо перестроить таблицу с помощью OPTIMIZE TABLE после установки COMPRESSION=None.

ALTER TABLE t1 COMPRESSION="None";
OPTIMIZE TABLE t1;

Метаданные о сжатии страниц

Метаданные о сжатии страниц находятся в таблице схемы информации INNODB_SYS_TABLESPACES в следующих столбцах:

  • FS_BLOCK_SIZE: размер блока файловой системы, который является единицей размера, используемой для пробивки дыр.

  • FILE_SIZE: видимый размер файла, который представляет собой максимальный размер файла, не сжатый.

  • ALLOCATED_SIZE: фактический размер файла, который является объемом выделенной на диске памяти.

Примечание

В системах Unix-подобных системах ls -l tablespace_name.ibd отображает видимый размер файла (эквивалентный FILE_SIZE) в байтах. Чтобы просмотреть фактический объем выделенной на диске памяти (эквивалентный ALLOCATED_SIZE), используйте du --block-size=1 tablespace_name.ibd. Опция --block-size=1 выводит выделенный объем в байтах вместо блоков, что позволяет сравнивать его с результатом работы команды ls -l.

Используйте SHOW CREATE TABLE, чтобы просмотреть текущее значение параметра сжатия страниц (Zlib, Lz4 или None). Таблица может содержать смесь страниц с различными параметрами сжатия.

В следующем примере метаданные о сжатии страниц для таблицы employees извлекаются из таблицы схемы информации INNODB_SYS_TABLESPACES.

# Create the employees table with Zlib page compression

CREATE TABLE employees (
    emp_no      INT             NOT NULL,
    birth_date  DATE            NOT NULL,
    first_name  VARCHAR(14)     NOT NULL,
    last_name   VARCHAR(16)     NOT NULL,
    gender      ENUM ('M','F')  NOT NULL,
    hire_date   DATE            NOT NULL,
    PRIMARY KEY (emp_no)
) COMPRESSION="zlib";

# Insert data (not shown)

# Query page compression metadata in INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES

mysql> SELECT SPACE, NAME, FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZE FROM
       INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME='employees/employees'\G
*************************** 1. row ***************************
SPACE: 45
NAME: employees/employees
FS_BLOCK_SIZE: 4096
FILE_SIZE: 23068672
ALLOCATED_SIZE: 19415040

Метаданные о сжатии страниц для таблицы employees показывают, что видимый размер файла составляет 23068672 байта, а фактический размер файла (со сжатием страниц) составляет 19415040 байт. Размер блока файловой системы составляет 4096 байт, что соответствует размеру блока, используемого для пробивки дыр.

Идентификация таблиц с использованием сжатия страниц

Чтобы определить таблицы, для которых включено сжатие страниц, можно запросить столбец CREATE_OPTIONS таблицы схемы информации TABLES для таблиц, определенных с помощью атрибута COMPRESSION:

mysql> SELECT TABLE_NAME, TABLE_SCHEMA, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES 
       WHERE CREATE_OPTIONS LIKE '%COMPRESSION=%';
+------------+--------------+--------------------+
| TABLE_NAME | TABLE_SCHEMA | CREATE_OPTIONS     |
+------------+--------------+--------------------+
| employees  | test         | COMPRESSION="zlib" |
+------------+--------------+--------------------+

SHOW CREATE TABLE также отображает атрибут COMPRESSION, если он используется.

Ограничения сжатия страниц и заметки по использованию

  • Сжатие страниц отключено, если размер блока файловой системы (или размер блока сжатия на Windows) * 2 > innodb_page_size.

  • Сжатие страниц не поддерживается для таблиц, расположенных в общих табличных пространствах, которые включают системное табличное пространство, временное табличное пространство и общие табличные пространства.

  • Сжатие страниц не поддерживается для табличных пространств журнала отмены.

  • Сжатие страниц не поддерживается для страниц журнала повтора.

  • Страницы R-дерева, используемые для пространственных индексов, не сжимаются.

  • Страницы, принадлежащие сжатым таблицам (ROW_FORMAT=COMPRESSED), остаются без изменений.

  • Во время восстановления обновленные страницы записываются в несжатом виде.

  • Загрузка табличного пространства со сжатыми страницами на сервере, не поддерживающем алгоритм сжатия, который использовался, приводит к ошибке ввода-вывода.

  • Перед понижением до более ранней версии MySQL, не поддерживающей сжатие страниц, необходимо разархивировать таблицы, использующие функцию сжатия страниц. Для разархивирования таблицы выполните ALTER TABLE ... COMPRESSION=None и OPTIMIZE TABLE.

  • Табличные пространства со сжатыми страницами можно копировать между серверами Linux и Windows, если алгоритм сжатия доступен на обоих серверах.

  • Сохранение сжатия страниц при перемещении файла табличного пространства со сжатыми страницами с одного хоста на другой требует утилиты, сохраняющей разреженные файлы.

  • На оборудовании Fusion-io с NVMFS может быть достигнуто лучшее сжатие страниц, чем на других платформах, так как NVMFS разработан для использования функциональности прокола отверстий.

  • Использование функции сжатия страниц с большим размером страницы InnoDB и относительно небольшим размером блока файловой системы может привести к усилению записи. Например, максимальный размер страницы InnoDB 64 КБ при размере блока файловой системы 4 КБ может улучшить сжатие, но также может увеличить нагрузку на кэш-память буфера, что приведет к увеличению операций ввода-вывода и потенциальному усилению записи.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/innodb-page-compression.html

Spec-Zone.ru

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