Spec-Zone.ru › MySQL 9.2

17.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. Размеры кластеров и их единицы сжатия показаны в следующей таблице:

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

Таблица 17.13 Размер кластера и единицы сжатия NTFS Windows
Размер кластера Единица сжатия
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_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_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_TABLESPACES

mysql> SELECT SPACE, NAME, FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZE FROM
       INFORMATION_SCHEMA.INNODB_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-9.2-en/innodb-page-compression.html

Spec-Zone.ru

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