Формат строк InnoDB COMPRESSED
В MariaDB 10.1 и более поздних версиях, альтернативный (и обычно лучший) способ сжатия таблиц InnoDB — использование сжатия страниц InnoDB. Смотрите Сравнение со сжатым форматом строк.
Формат строк COMPRESSED похож на формат строк COMPACT, но таблицы, использующие формат COMPRESSED, могут хранить ещё больше данных на страницах переполнения, чем таблицы, использующие формат COMPACT. Это приводит к более эффективному хранению данных, чем таблицы, использующие формат COMPACT, особенно для таблиц, содержащих столбцы с типами данных VARBINARY, VARCHAR, BLOB и TEXT.
Формат строк COMPRESSED также поддерживает сжатие всех страниц данных и индексов.
Использование формата строк COMPRESSED
Таблицу InnoDB, использующую формат строк COMPRESSED, можно создать, установив опцию таблицы ROW_FORMAT в значение COMPRESSED и установив опцию таблицы KEY_BLOCK_SIZE на одно из следующих значений в операторе CREATE TABLE или ALTER TABLE, где единицы измерения — KB:
-
1 -
2 -
4 -
8 -
16
16k — это значение по умолчанию для системной переменной innodb_page_size, поэтому использование 16 обычно приводит к минимальному сжатию, если не выполняется хотя бы одно из следующих условий:
- Таблица имеет много столбцов, которые могут храниться на страницах переполнения, таких как столбцы, использующие типы данных VARBINARY, VARCHAR, BLOB и TEXT.
- Сервер использует значение innodb_page_size, отличное от значения по умолчанию, и большее, чем
16k.
В MariaDB 10.1 и более поздних версиях значение системной переменной innodb_page_size может быть установлено в 32k и 64k. Это особенно полезно, потому что больший размер страницы позволяет использовать больше столбцов с типами данных VARBINARY, VARCHAR, BLOB и TEXT. Независимо от этого, даже если значение системной переменной innodb_page_size установлено на значение, большее, чем 16k, 16 по-прежнему является максимальным значением для опции таблицы KEY_BLOCK_SIZE для таблиц InnoDB, использующих формат строк COMPRESSED.
Формат строк COMPRESSED не может быть установлен в качестве формата строк по умолчанию с помощью системной переменной innodb_default_row_format.
Формат строк COMPRESSED поддерживается только форматом файла Barracuda формата файла. В качестве побочного эффекта, в MariaDB 10.1 и более ранних версиях формат строк COMPRESSED поддерживается только если формат файла InnoDB равен Barracuda. Поэтому системная переменная innodb_file_format должна быть установлена в Barracuda, чтобы использовать эти форматы строк в этих версиях.
В MariaDB 10.1 и более ранних версиях формат строк COMPRESSED также поддерживается только в случае, если таблица находится в табличном пространстве по типу «файл на таблицу» file per-table. Поэтому системная переменная innodb_file_per_table должна быть установлена в ON, чтобы использовать этот формат строк в этих версиях.
Также рекомендуется установить системную переменную innodb_strict_mode в значение ON при использовании этого формата строк.
InnoDB автоматически использует формат строк COMPRESSED для таблицы, если опция таблицы KEY_BLOCK_SIZE установлена на какое-либо значение в операторе CREATE TABLE или ALTER TABLE. Например:
SET SESSION innodb_strict_mode=ON; SET GLOBAL innodb_file_per_table=ON; SET GLOBAL innodb_file_format='Barracuda'; CREATE TABLE tab ( id int, str varchar(50) ) ENGINE=InnoDB KEY_BLOCK_SIZE=4;
Если опция таблицы KEY_BLOCK_SIZE не установлена на какое-либо значение, но опция таблицы ROW_FORMAT установлена в значение COMPRESSED в операторе CREATE TABLE или ALTER TABLE, то InnoDB использует значение по умолчанию 8 для опции таблицы KEY_BLOCK_SIZE. Например:
SET SESSION innodb_strict_mode=ON; SET GLOBAL innodb_file_per_table=ON; SET GLOBAL innodb_file_format='Barracuda'; CREATE TABLE tab ( id int, str varchar(50) ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;
Сжатие с форматом строк COMPRESSED
Формат строк COMPRESSED поддерживает сжатие всех страниц данных и индексов.
Чтобы избежать слишком частых операций сжатия и распаковки страниц, InnoDB пытается сохранить как сжатые, так и несжатые страницы в пуле буферов buffer pool, если есть достаточно места. Это приводит к большему кешу. При недостатке места используется адаптивный алгоритм LRU, чтобы определить, какие страницы, сжатые или несжатые, следует удалить из буфера: для CPU-связанных рабочих нагрузок сначала удаляются сжатые страницы; для I/O-связанных рабочих нагрузок — несжатые. Конечно, при необходимости и сжатые, и несжатые версии одних и тех же данных могут быть удалены из буфера.
Каждая сжатая страница имеет несжатый журнал изменений, хранящийся в самой странице. InnoDB записывает небольшие изменения в него. Когда место в журнале изменений заканчивается, страница распаковывается, изменения применяются, и страница сжимается снова. Это делается для того, чтобы избежать некоторых ненужных операций сжатия и распаковки.
Иногда может произойти сбой сжатия, потому что данные стали слишком большими, чтобы уместиться на странице. В этом случае страница (и узел индекса) разделяется на две разные страницы. Этот процесс может повторяться рекурсивно до тех пор, пока данные не уместятся на страницах. Это может быть ресурсоёмким для некоторых загруженных серверов, выполняющих много операций записи.
Перед записью сжатой страницы в файл данных InnoDB записывает её в журнал пересоздания. Это гарантирует, что журнал пересоздания всегда можно использовать для восстановления таблиц после сбоя, даже если библиотека сжатия обновлена и введены некоторые несовместимости. Но это также означает, что журнал пересоздания будет расти быстрее и может потребоваться больше места, или может понадобиться увеличить частоту контрольных точек.
Мониторинг производительности формата строк COMPRESSED
Для мониторинга производительности сжатых таблиц InnoDB можно использовать следующие таблицы INFORMATION_SCHEMA:
- INNODB_CMP и INNODB_CMP_RESET
- INNODB_CMP_PER_INDEX и INNODB_CMP_PER_INDEX_RESET
- INNODB_CMPMEM и INNODB_CMPMEM_RESET
Префиксы индексов с форматом строк COMPRESSED
Формат строк COMPRESSED поддерживает префиксы индексов до 3072 байт. В MariaDB 10.2 и более ранних версиях системная переменная innodb_large_prefix используется для настройки максимальной длины префикса индекса. В этих версиях, если innodb_large_prefix установлена в ON, максимальная длина префикса — 3072 байта, а если она установлена в OFF, максимальная длина префикса — 767 байт.
Страницы переполнения с форматом строк COMPRESSED
Все форматы строк InnoDB могут хранить определённые типы данных на страницах переполнения. Это позволяет сделать максимальный размер строки таблицы InnoDB больше, чем максимальное количество данных, которое может храниться на основной странице данных строки. Смотрите Максимальный размер строки для получения дополнительной информации о других факторах, которые могут повлиять на максимальный размер строк в таблицах InnoDB.
В формате строк COMPRESSED переменные столбцы, такие как столбцы, использующие типы данных VARBINARY, VARCHAR, BLOB и TEXT, могут полностью храниться на страницах переполнения.
InnoDB учитывает использование страниц переполнения только если размер строки таблицы больше половины значения innodb_page_size. Если размер строки больше этого значения, InnoDB выбирает переменные столбцы для хранения на страницах переполнения, пока размер строки не станет меньше половины значения innodb_page_size.
Для столбцов BLOB и TEXT значения длиной более 40 байтов рассматриваются для хранения на страницах переполнения. Для столбцов VARBINARY и VARCHAR значения длиной более 255 байтов рассматриваются для хранения на страницах переполнения. Байты, используемые для отслеживания длины значения, не учитываются в этих ограничениях. Эти ограничения основаны только на длине фактических данных столбца.
Эти ограничения отличаются от ограничений для формата строк COMPACT, где ограничение составляет 767 байт для всех типов.
Столбцы фиксированной длины, превышающие 767 байт, кодируются как столбцы переменной длины, поэтому они также могут храниться в страницах переполнения, если размер строки таблицы превышает половину значения innodb_page_size. Несмотря на то, что столбец, использующий тип данных CHAR, может содержать не более 255 символов, столбец CHAR в некоторых случаях может превышать 767 байт. Например, столбец char(255) может превысить 767 байт, если кодировка символов равна utf8mb4.
Если столбец выбран для хранения на страницах переполнения, то всё значение столбца хранится на страницах переполнения, а на главной странице хранится только 20-байтовый указатель на первую страницу переполнения столбца. Каждая страница переполнения имеет размер innodb_page_size. Если столбец слишком велик для хранения на одной странице переполнения, он хранится на нескольких страницах переполнения. Каждая страница переполнения содержит часть данных и 20-байтовый указатель на следующую страницу переполнения, если следующая страница существует.
Это поведение отличается от поведения формата строки COMPACT, который всегда хранит префикс столбца на главной странице. Это позволяет таблицам, использующим формат строки COMPRESSED, содержать большое количество столбцов с типами данных VARBINARY, VARCHAR, BLOB и TEXT.
Только чтение
С версии MariaDB 10.6.0 по MariaDB 10.6.5 таблицы формата COMPRESSED по умолчанию были только для чтения. Это должно было стать первым шагом к удалению поддержки записи и устареванию данной функции.
Этот план был отменён, и с MariaDB 10.6.6 таблицы COMPRESSED по умолчанию больше не являются только для чтения.
С MariaDB 10.6.0 по MariaDB 10.6.5 установите переменную innodb_read_only_compressed в значение OFF, чтобы сделать таблицы доступными для записи.
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/innodb-compressed-row-format/