Spec-Zone.ru › MariaDB

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

Обзор

Сжатие страниц InnoDB позволяет сжимать таблицы InnoDB.

Примеры применения

  • Сжатие страниц InnoDB может быть использовано на любом устройстве хранения и любой файловой системе.
  • Сжатие страниц InnoDB наиболее эффективно в файловых системах, поддерживающих разреженные файлы. Подробную информацию см. в разделе Экономия места на диске с помощью разреженных файлов.
  • Сжатие страниц InnoDB наиболее полезно на твердотельных накопителях (SSD) и других накопителях на флеш-памяти. Подробную информацию см. в разделе Оптимизация для флеш-хранения.
  • Сжатие страниц InnoDB работает лучше всего, когда ваше устройство хранения и файловая система поддерживают атомарные записи, так как это позволяет отключить буфер двойной записи InnoDB. Подробную информацию см. в разделе Буфер двойной записи InnoDB. Подробную информацию см. в разделе Поддержка атомарных записей.

Сравнение со строковым форматом COMPRESSED

Сжатие страниц InnoDB — современный способ сжатия ваших таблиц InnoDB. Оно похоже на строковый формат COMPRESSED InnoDB, но имеет много преимуществ. Некоторые из различий:

  • При сжатии страниц InnoDB сжатые страницы сразу же декомпримируются после чтения из файла табличного пространства, и только не сжатые страницы хранятся в буферном пуле. В отличие от этого, в строковом формате COMPRESSED InnoDB сжатые страницы декомпримируются сразу после чтения из файла табличного пространства, и как сжатые, так и не сжатые страницы хранятся в буферном пуле. Это означает, что строковый формат COMPRESSED использует больше места в буферном пуле, чем сжатие страниц InnoDB.
  • При сжатии страниц InnoDB страницы сжимаются непосредственно перед записью в файл табличного пространства. В отличие от этого, в строковом формате COMPRESSED InnoDB страницы пересжимаются сразу после любых изменений, и сжатые страницы хранятся в буферном пуле вместе со страницы не сжатыми. Эти изменения периодически записываются на диск. Это означает, что строковый формат COMPRESSED пересжимает данные чаще, чем сжатие страниц InnoDB.
  • При сжатии страниц InnoDB поддерживается несколько алгоритмов сжатия. В отличие от строкового формата COMPRESSED InnoDB, только zlib является единственным поддерживаемым алгоритмом сжатия. Это означает, что строковый формат COMPRESSED имеет меньше вариантов сжатия, чем сжатие страниц InnoDB.

В целом, сжатие страниц InnoDB превосходит строковый формат COMPRESSED.

Сравнение со сжатием столбцов, независимым от движка хранения

  • См. Сжатие столбцов, независимое от движка хранения — сравнение со сжатием страниц InnoDB.

Настройка алгоритма сжатия страниц InnoDB

В настоящее время нет возможности установить различные алгоритмы сжатия страниц InnoDB для отдельных таблиц.

Однако, алгоритм сжатия страниц InnoDB на уровне сервера можно настроить, установив переменную системы innodb_compression_algorithm.

При изменении этой переменной алгоритм сжатия страниц InnoDB не меняется для существующих страниц, которые уже были сжаты с другим алгоритмом сжатия страниц InnoDB. InnoDB может обрабатывать эту ситуацию без проблем, потому что каждая страница в табличном пространстве InnoDB содержит метаданные об алгоритме сжатия страниц InnoDB в заголовке страницы. Это означает, что InnoDB поддерживает наличие несжатых страниц и страниц, сжатых с разными алгоритмами сжатия страниц InnoDB, в одном табличном пространстве InnoDB одновременно.

Эта переменная системы может быть установлена в одно из следующих значений:

Значение переменной системы Описание
none Страницы не сжимаются. Это значение по умолчанию в MariaDB 10.2.3 и ранее, и MariaDB 10.1.21 и ранее.
zlib Страницы сжимаются с помощью алгоритма сжатия zlib. Это значение по умолчанию в MariaDB 10.2.4 и позже, и MariaDB 10.1.22 и позже.
lz4 Страницы сжимаются с помощью алгоритма сжатия lz4.
lzo Страницы сжимаются с помощью алгоритма сжатия lzo.
lzma Страницы сжимаются с помощью алгоритма сжатия lzma.
bzip2 Страницы сжимаются с помощью алгоритма сжатия bzip2.
snappy Страницы сжимаются с помощью алгоритма сжатия snappy.

Однако во многих дистрибутивах стандартные сборки MariaDB по умолчанию не поддерживают все алгоритмы сжатия страниц InnoDB. Начиная с MariaDB 10.7, алгоритмы могут быть установлены как плагин.

Эта переменная системы может быть динамически изменена с помощью SET GLOBAL. Например:

SET GLOBAL innodb_compression_algorithm='lzma';

Эту переменную системы также можно установить в группе параметров сервера в файле параметров перед запуском сервера. Например:

[mariadb]
...
innodb_compression_algorithm=lzma

Проверка поддерживаемых алгоритмов сжатия страниц InnoDB

Во многих дистрибутивах стандартные сборки MariaDB по умолчанию не поддерживают все алгоритмы сжатия страниц InnoDB. Поэтому, если вы хотите использовать определенный алгоритм сжатия страниц InnoDB, вам необходимо проверить, поддерживает ли ваша сборка MariaDB этот алгоритм.

Алгоритм сжатия zlib всегда поддерживается. Начиная с MariaDB 10.7, алгоритмы могут быть установлены как плагин.

Поддержка других алгоритмов сжатия страниц InnoDB в сборке MariaDB можно проверить, запросив следующие переменные состояния с помощью SHOW GLOBAL STATUS:

Переменная состояния Описание
Innodb_have_lz4 Поддерживает ли InnoDB алгоритм сжатия lz4.
Innodb_have_lzo Поддерживает ли InnoDB алгоритм сжатия lzo.
Innodb_have_lzma Поддерживает ли InnoDB алгоритм сжатия lzma.
Innodb_have_bzip2 Поддерживает ли InnoDB алгоритм сжатия bzip2.
Innodb_have_snappy Поддерживает ли InnoDB алгоритм сжатия snappy.

Например:

SHOW GLOBAL STATUS WHERE Variable_name IN (
   'Innodb_have_lz4', 
   'Innodb_have_lzo', 
   'Innodb_have_lzma', 
   'Innodb_have_bzip2', 
   'Innodb_have_snappy'
);
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| Innodb_have_lz4    | OFF   |
| Innodb_have_lzo    | OFF   |
| Innodb_have_lzma   | ON    |
| Innodb_have_bzip2  | OFF   |
| Innodb_have_snappy | OFF   |
+--------------------+-------+

Добавление поддержки алгоритма сжатия страниц InnoDB

Во многих дистрибутивах стандартные сборки MariaDB по умолчанию не поддерживают все алгоритмы сжатия страниц InnoDB. Начиная с MariaDB 10.7, алгоритмы могут быть установлены как плагин, но в более ранних версиях, если вы хотите использовать определенные алгоритмы сжатия страниц InnoDB, вам может потребоваться выполнить следующие действия:

  • Загрузите пакет для нужной библиотеки сжатия из указанных выше ссылок.
  • Установите пакет для нужной библиотеки сжатия.
  • Скомпилируйте MariaDB из исходного дистрибутива.

Общие шаги по компиляции MariaDB:

  • Загрузите и распакуйте исходный код дистрибутива:
wget https://downloads.mariadb.com/MariaDB/mariadb-10.4.8/source/mariadb-10.4.8.tar.gz
tar -xvzf mariadb-10.4.8.tar.gz
cd mariadb-10.4.8/
  • Настройте сборку с помощью cmake:
cmake .
  • Проверьте CMakeCache.txt, чтобы убедиться, что он нашел нужную библиотеку сжатия на вашей системе.
  • Скомпилируйте сборку:
make
  • Либо установите сборку:
make install

Или создайте пакет для установки:

make package

См. Сборка MariaDB из исходных кодов для получения дополнительной информации.

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

Сжатие страниц InnoDB по умолчанию отключено. Однако сжатие страниц InnoDB может быть включено только для отдельных таблиц InnoDB или по умолчанию для всех новых таблиц InnoDB.

Сжатие страниц InnoDB поддерживается только если таблица InnoDB находится в табличном пространстве с одним файлом на таблицу. Поэтому переменная системы innodb_file_per_table должна быть установлена в значение ON для использования сжатия страниц InnoDB.

Сжатие страниц InnoDB поддерживается только если таблица InnoDB использует формат файла Barracuda. Поэтому в MariaDB 10.1 и ранее переменная системы innodb_file_format должна быть установлена в значение Barracuda для использования сжатия страниц InnoDB.

Сжатие страниц InnoDB также поддерживается только если формат строк таблицы InnoDB — формат строк COMPACT или DYNAMIC.

Включение сжатия страниц InnoDB по умолчанию

В MariaDB 10.2.3 и более поздних версиях сжатие страниц InnoDB можно включить для всех новых таблиц InnoDB по умолчанию, установив системную переменную innodb_compression_default в значение ON.

Эта системная переменная может принимать следующие значения:

Значение системной переменной Описание
OFF Новые таблицы InnoDB не используют сжатие страниц InnoDB. Это значение по умолчанию.
ON Новые таблицы InnoDB используют сжатие страниц InnoDB.

Эта системная переменная может быть изменена динамически с помощью SET GLOBAL. Например:

SET GLOBAL innodb_compression_default=ON;

Значение этой системной переменной для сессии может быть изменено динамически с помощью SET SESSION. Например:

SET GLOBAL innodb_file_per_table=ON;

SET GLOBAL innodb_file_format='Barracuda';

SET GLOBAL innodb_default_row_format='dynamic';

SET GLOBAL innodb_compression_algorithm='lzma';

SET SESSION  innodb_compression_default=ON;

CREATE TABLE users (
   user_id int not null, 
   b varchar(200), 
   primary key(user_id)
) 
   ENGINE=InnoDB;

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

[mariadb]
...
innodb_compression_default=ON

Включение сжатия страниц InnoDB для отдельных таблиц

Сжатие страниц InnoDB можно включить для отдельных таблиц, установив опцию таблицы PAGE_COMPRESSED в значение 1. Например:

SET GLOBAL innodb_file_per_table=ON;

SET GLOBAL innodb_file_format='Barracuda';

SET GLOBAL innodb_default_row_format='dynamic';

SET GLOBAL innodb_compression_algorithm='lzma';

CREATE TABLE users (
   user_id int not null, 
   b varchar(200), 
   primary key(user_id)
) 
   ENGINE=InnoDB
   PAGE_COMPRESSED=1;

Настройка уровня сжатия

Некоторые алгоритмы сжатия страниц InnoDB поддерживают опцию уровня сжатия, которая настраивает, как алгоритм сжатия страниц InnoDB будет балансировать скорость и степень сжатия.

Поддерживаемые значения уровня сжатия варьируются от 1 до 9. Диапазон варьируется от самого быстрого до самого компактного, то есть 1 — самое быстрое, а 9 — самое компактное.

В настоящее время только следующие алгоритмы сжатия страниц InnoDB поддерживают уровни сжатия:

  • zlib
  • lzma

Если алгоритм сжатия страниц InnoDB не поддерживает уровни сжатия, он игнорирует предоставленное значение уровня сжатия.

Настройка уровня сжатия по умолчанию

Уровень сжатия по умолчанию можно настроить, установив системную переменную innodb_compression_level.

Значение этой системной переменной по умолчанию — 6.

Эта системная переменная может быть изменена динамически с помощью SET GLOBAL. Например:

SET GLOBAL innodb_compression_level=9;

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

[mariadb]
...
innodb_compression_level=9

Настройка уровня сжатия для отдельных таблиц

Уровень сжатия для отдельных таблиц также можно настроить, установив опцию таблицы PAGE_COMPRESSION_LEVEL для таблицы. Например:

SET GLOBAL innodb_file_per_table=ON;

SET GLOBAL innodb_file_format='Barracuda';

SET GLOBAL innodb_default_row_format='dynamic';

SET GLOBAL innodb_compression_algorithm='lzma';

CREATE TABLE users (
   user_id int not null, 
   b varchar(200), 
   primary key(user_id)
) 
   ENGINE=InnoDB
   PAGE_COMPRESSED=1
   PAGE_COMPRESSION_LEVEL=9;

Настройка порога сбоев и максимального заполнения

При использовании сжатия страниц InnoDB могут возникать сбои сжатия.

Можно настроить порог сбоев сжатия страниц InnoDB. Если InnoDB столкнётся с количеством сбоев сжатия, превышающим порог сбоев, он заполнит страницы нулями перед попыткой их сжатия, чтобы уменьшить количество сбоев. Если частота сбоев остаётся выше порога сбоев, InnoDB заполнит страницы дополнительными нулями с шагом 128 байт.

Также можно настроить максимальное заполнение при сжатии страниц InnoDB.

Настройка порога сбоев

Порог сбоев можно настроить, установив системную переменную innodb_compression_failure_threshold_pct.

Поддерживаемые значения этой системной переменной варьируются от 0 до 100.

Значение этой системной переменной по умолчанию — 5.

Эта системная переменная может быть изменена динамически с помощью SET GLOBAL. Например:

SET GLOBAL innodb_compression_failure_threshold_pct=10;

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

[mariadb]
...
innodb_compression_failure_threshold_pct=10

Настройка максимального заполнения

Максимальное заполнение можно настроить, установив системную переменную innodb_compression_pad_pct_max.

Поддерживаемые значения этой системной переменной варьируются от 0 до 75.

Значение этой системной переменной по умолчанию — 50.

Эта системная переменная может быть изменена динамически с помощью SET GLOBAL. Например:

SET GLOBAL innodb_compression_pad_pct_max=75;

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

[mariadb]
...
innodb_compression_pad_pct_max=75

Экономия места на диске с помощью разреженных файлов

При использовании сжатия страниц InnoDB, InnoDB может всё ещё записывать сжатую страницу в файл табличного пространства с исходным размером несжатой страницы, что эквивалентно значению системной переменной innodb_page_size. Это сделано по умолчанию, потому что при чтении страницы InnoDB из диска может быть прочитан только полный размер страницы. Однако это не оптимально.

В файловых системах, которые поддерживают разреженные файлы, эта проблема решается записью файла табличного пространства как разреженного файла с помощью техники пробивания отверстий. С помощью техники пробивания отверстий InnoDB запишет только фактический размер сжатой страницы в файл табличного пространства, выровненный по размеру сектора. Остальная часть страницы обрезается.

Эта техника пробивания отверстий позволяет InnoDB читать сжатую страницу из диска как страницу полного размера, даже если сжатая страница действительно занимает меньше места в файловой системе.

Существуют некоторые потенциальные недостатки использования разреженных файлов:

  • Некоторые утилиты могут потребовать специальных опций для эффективной работы с разреженными файлами.
  • Большинство существующих файловых систем медленные при unlink() разреженных файлов. Вследствие этого, если файл табличного пространства является разреженным, удаление таблицы может быть очень медленным.

Поддержка разреженных файлов в Linux

В Linux следующие файловые системы поддерживают разреженные файлы:

  • ext3
  • ext4
  • xfs
  • btrfs
  • nvmfs

В Linux файловые системы должны поддерживать системный вызов fallocate() с флагами FALLOC_FL_PUNCH_HOLE и FALLOC_FL_KEEP_SIZE. Например:

fallocate(file_handle, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, file_offset, remainder_len);

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

  • Утилита ls при стандартном использовании выведет размер неразреженного файла табличного пространства, но ls -s выведет фактическое количество выделенной памяти для файла табличного пространства.
  • Утилита cp достаточно хорошо сама определяет разреженные файлы, но она также предоставляет опции cp --sparse=always и cp --sparse=never, если автоматическое определение не требуется.
  • Утилита tar при стандартном использовании архивирует разреженные файлы с их неразреженным размером, но tar --sparse автоматически определит разреженный файл и архивирует его с его разреженным размером.

Поддержка разреженных файлов в Windows

В Windows следующие файловые системы поддерживают разреженные файлы:

  • NTFS

В Windows файловые системы должны поддерживать функцию DeviceIoControl() с кодами управления FSCTL_SET_SPARSE и FSCTL_SET_ZERO_DATA. Например:

DeviceIoControl(file_handle, FSCTL_SET_SPARSE, inbuf, inbuf_size, 
   outbuf, outbuf_size,  NULL, &overlapped)
...
DeviceIoControl(file_handle, FSCTL_SET_ZERO_DATA, inbuf, inbuf_size, 
   outbuf, outbuf_size,  NULL, &overlapped)

Настройка InnoDB для использования разреженных файлов

В MariaDB 10.3 и более поздних версиях InnoDB автоматически использует технику пробивания отверстий для создания разреженных файлов, если файловая система поддерживает разреженные файлы.

В MariaDB 10.2 и более ранних версиях InnoDB можно настроить использование техники пробивания отверстий для создания разреженных файлов, настроив системные переменные innodb_use_trim и innodb_use_fallocate. Эти системные переменные можно задать в группе опций сервера в файле опций группы опций файла опций до запуска сервера. Например:

[mariadb]
...
innodb_use_trim=ON
innodb_use_fallocate=ON

Оптимизация для флэш-хранилища

Сжатие страниц InnoDB было разработано для оптимизации на твердотельных накопителях (SSD) и других флэш-накопителях.

Сжатие страниц InnoDB первоначально было разработано в сотрудничестве с Fusion-io. Вследствие этого, оно первоначально было разработано для наилучшей работы на устройствах FusionIO с использованием NVMFS. Fusion-io с тех пор была приобретена Western Digital, и они решили не продолжать поддержку NVMFS.

Однако, сжатие страниц InnoDB, вероятно, по-прежнему будет наилучшим образом оптимизировано на твердотельных накопителях (SSD) и других флэш-накопителях.

Сжатие страниц InnoDB работает без проблем на жестких дисках (HDD). Однако, поскольку его сжатие основано на использовании разреженных файлов, данные могут быть несколько фрагментированы на диске. Эта фрагментация может навредить производительности на HDD, так как они обрабатывают случайные чтения и записи гораздо медленнее, чем флэш-накопители.

Настройка сброса страниц InnoDB

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

Мониторинг сжатия страниц InnoDB

Сжатие страниц InnoDB можно отслеживать, запрашивая следующие переменные состояния с помощью SHOW GLOBAL STATUS:

Переменная состояния Описание
Innodb_page_compression_saved Байты, сэкономленные благодаря сжатию
Innodb_page_compression_trim_sect512 Количество 512-секторных участков, убранных
Innodb_page_compression_trim_sect1024 Количество 1024-секторных участков, убранных
Innodb_page_compression_trim_sect2048 Количество 2048-секторных участков, убранных
Innodb_page_compression_trim_sect4096 Количество 4096-секторных участков, убранных
Innodb_page_compression_trim_sect8192 Количество 8192-секторных участков, убранных
Innodb_page_compression_trim_sect16384 Количество 16384-секторных участков, убранных
Innodb_page_compression_trim_sect32768 Количество 32768-секторных участков, убранных
Innodb_num_pages_page_compressed Количество сжатых страниц
Innodb_num_page_compressed_trim_op Количество операций обрезки
Innodb_num_page_compressed_trim_op_saved Количество сэкономленных операций обрезки
Innodb_num_pages_page_decompressed Количество распакованных страниц
Innodb_num_pages_page_compression_error Количество ошибок сжатия

При использовании сжатия страниц InnoDB страница сжимается только при её сбросе на диск. Это означает, что если вы отслеживаете сжатие страниц InnoDB с помощью этих переменных состояния, то значения переменных будут увеличиваться только при сбросе грязных страниц на диск, что не обязательно происходит немедленно. Например:

CREATE TABLE `tab` (
     `id` int(11) NOT NULL,
     `str` varchar(50) DEFAULT NULL,
     PRIMARY KEY (`id`)
   ) ENGINE=InnoDB;
 
INSERT INTO tab VALUES (1, 'str1');

SHOW GLOBAL STATUS LIKE 'Innodb_num_pages_page_compressed';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| Innodb_num_pages_page_compressed | 0     |
+----------------------------------+-------+
 
SET GLOBAL innodb_file_per_table=ON;

SET GLOBAL innodb_file_format='Barracuda';

SET GLOBAL innodb_default_row_format='dynamic';

SET GLOBAL innodb_compression_algorithm='lzma';
 
ALTER TABLE tab PAGE_COMPRESSED=1;

SHOW GLOBAL STATUS LIKE 'Innodb_num_pages_page_compressed';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| Innodb_num_pages_page_compressed | 0     |
+----------------------------------+-------+
 
SELECT SLEEP(10);
+-----------+
| SLEEP(10) |
+-----------+
|         0 |
+-----------+
 
SHOW GLOBAL STATUS LIKE 'Innodb_num_pages_page_compressed';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| Innodb_num_pages_page_compressed | 3     |
+----------------------------------+-------+

Совместимость с инструментами резервного копирования

Mariabackup поддерживает сжатие страниц InnoDB.

Percona XtraBackup не поддерживает сжатие страниц InnoDB.

Благодарности

  • Сжатие страниц InnoDB было разработано в сотрудничестве с Fusion-io. Особая благодарность Dhananjoy Das и Torben Mathiasen.

См. также

  • Сжатие столбцов, независимое от движка хранилища
  • Поддержка атомарных записей
  • MariaDB представляет атомарные записи
  • Small Datum: Третий день со сжатием страниц InnoDB
  • Сжатие InnoDB holepunch против файловой системы в MariaDB 10.1
  • Значительный прирост производительности с новым сжатием страниц MariaDB на FusionIO
  • INFLOW '14: Сжатие NVM — гибридное флэш-ориентированное сжатие на уровне приложения
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проходит предварительную проверку MariaDB. Мнения, информация и мнения, выраженные в этом контенте, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/innodb-page-compression/

Spec-Zone.ru

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