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 и единицы сжатия
| Размер кластера | Единица сжатия |
|---|---|
| 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.ibdFILE_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и относительно небольшим размером блока файловой системы может привести к усилению записи. Например, максимальный размер страницыInnoDB64 КБ при размере блока файловой системы 4 КБ может улучшить сжатие, но также может увеличить нагрузку на кэш-память буфера, что приведет к увеличению операций ввода-вывода и потенциальному усилению записи.
© 2025 Oracle
Licensed under the GPLv2 License.