Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Сжатие кортежей

Сжатие кортежей, появившееся в 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.

Пример сжатия существующих полей:

  1. Создайте спейс без сжатия и добавьте несколько кортежей:

    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. Предположим, что поля 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.

  3. Чтобы завершить изменение, создайте снимок с помощью box.snapshot() и перезапустите Tarantool. В результате все старые кортежи также будут сжаты в памяти во время восстановления.

Производительность сжатия кортежей

Ниже приведены результаты синтетического теста, которые показывают, как сжатие кортежей влияет на производительность. Тест проводился на простом спейсе Tarantool, содержащем 100 000 кортежей, каждый из которых имеет поле с примером JSON размером примерно 600 байт. В тесте сравнивалась скорость выполнения операций select и replace на несжатых и сжатых данных, а также общий размер данных спейса. Производительность измеряется в запросах в секунду.

Тип сжатия

select, RPS

replace, RPS

Размер спейса

Без сжатия

4,486k

1,109k

41,168,548

zstd

308k

26k

21,368,548

lz4

1,765k

672k

25,268,548

zlib

325k

107k

20,768,548