Spec-Zone.ru › MySQL 8.4

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-8.4-en/innodb-page-compression.html

Spec-Zone.ru

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