Сжатие кортежей
Сжатие кортежей, появившееся в Tarantool Enterprise Edition 2.10.0, предназначено для экономии памяти. Как правило, объем хранимых данных уменьшается на 15%. Однако точный объем сэкономленных данных зависит от типа данных.
Поддерживаются следующие алгоритмы сжатия:
Подробнее о влиянии каждого алгоритма на производительность см. Производительность сжатия кортежей.
Tarantool сжимает не сами кортежи, а только поля внутри них. Сжимать можно только поля, не входящие в индекс. Сжатие работает лучше всего, когда в поле хранится JSON.
Сначала создайте спейс:
box.schema.space.create('bands')
Затем создайте индекс для этого спейса, например:
box.space.bands:create_index('primary', {parts = {{1, 'unsigned'}}})
Создайте формат, чтобы объявить имена и типы полей. В примере ниже поля
band_name и year имеют форматы сжатия zstd и lz4 соответственно.
Первое поле (id) входит в индекс, поэтому его нельзя сжать.
box.space.bands:format({{name = 'id', type = 'unsigned'},{name = 'band_name', type = 'string', compression = 'zstd'},{name = 'year', type = 'unsigned', compression = 'lz4'}})
Теперь новые кортежи, добавляемые в спейс bands, будут сжиматься. При
чтении сжатого кортежа его не нужно распаковывать вручную.
Чтобы проверить, какие поля в спейсе сжаты, вызовите space_object:format() для спейса. Если поле сжато, формат содержит алгоритм сжатия, например:
tarantool> box.space.bands:format()---- [{'name': 'id', 'type': 'unsigned'},{'type': 'string', 'compression': 'zstd', 'name': 'band_name'},{'type': 'unsigned', 'compression': 'lz4', 'name': 'year'}]...
Сжатие можно включить для существующих полей. Все кортежи, добавленные после этого, будут иметь это поле сжатым. Однако это не влияет на кортежи, уже хранящиеся в спейсе. Чтобы сжать существующие кортежи, нужно сделать снимок и перезапустить Tarantool.
Пример сжатия существующих полей:
-
Создайте спейс без сжатия и добавьте несколько кортежей:
box.schema.space.create('bands')box.space.bands:format({{ name = 'id', type = 'unsigned' },{ name = 'band_name', type = 'string' },{ name = 'year', type = 'unsigned' }})box.space.bands:create_index('primary', { parts = { 'id' } })box.space.bands:insert { 1, 'Roxette', 1986 }box.space.bands:insert { 2, 'Scorpions', 1965 }box.space.bands:insert { 3, 'Ace of Base', 1987 }box.space.bands:insert { 4, 'The Beatles', 1960 } -
Предположим, что поля 2 и 3 нужно сжать с этого момента. Чтобы включить сжатие, измените формат следующим образом:
local new_format = box.space.bands:format()new_format[2].compression = 'zstd'new_format[3].compression = 'lz4'box.space.bands:format(new_format)С этого момента все кортежи, добавляемые в спейс, будут иметь сжатые поля 2 и 3.
-
Чтобы завершить изменение, создайте снимок с помощью box.snapshot() и перезапустите Tarantool. В результате все старые кортежи также будут сжаты в памяти во время восстановления.
Ниже приведены результаты синтетического теста,
которые показывают, как сжатие кортежей влияет на производительность.
Тест проводился на простом спейсе Tarantool, содержащем 100 000
кортежей, каждый из которых имеет поле с примером JSON размером примерно
600 байт. В тесте сравнивалась скорость выполнения операций select и
replace на несжатых и сжатых данных, а также общий размер данных
спейса. Производительность измеряется в запросах в секунду.
Тип сжатия |
|
| Размер спейса |
|---|---|---|---|
Без сжатия | 4,486k | 1,109k | 41,168,548 |
| 308k | 26k | 21,368,548 |
| 1,765k | 672k | 25,268,548 |
| 325k | 107k | 20,768,548 |