Todos os produtos
Search
Central de documentação

Lindorm:Teste de compressão de dados

Última atualização: Jun 28, 2026

Este tópico compara o desempenho de compressão de dados do Lindorm com o HBase open source, MySQL e MongoDB em quatro conjuntos de dados reais: pedidos, Internet dos Veículos (IoV), logs e comportamento de usuários.

Ambiente de teste

O Lindorm é um serviço de banco de dados hiperconvergente multimodelo que usa o algoritmo de compressão zstd por padrão e oferece suporte à compressão baseada em dicionário. Esse recurso melhora a taxa de compressão ao otimizar a amostragem do dicionário durante a codificação dos dados.

A tabela a seguir mostra as versões dos bancos de dados e as configurações de compressão usadas neste teste.

Banco de dados

Versão

Compressão padrão

Observações

Lindorm

Mais recente

zstd (otimizado)

Compressão baseada em dicionário disponível

HBase open source

2.3.4

Snappy

O zstd tem suporte em versões posteriores do Hadoop, mas tende a apresentar problemas de estabilidade e core dumps; a maioria das implantações usa Snappy

MySQL open source

8,0

Nenhuma (desativada)

O zlib está disponível, mas degrada significativamente o desempenho das consultas quando ativado

MongoDB open source

5,0

Snappy

O zstd está disponível como alternativa

Importante

Este teste segue apenas partes das especificações de benchmark TPC. Os resultados não são equivalentes nem comparáveis aos de testes que seguem integralmente as especificações de benchmark TPC.

Cada cenário testa e compara as seguintes configurações:

  • Lindorm com zstd (padrão)

  • Lindorm com compressão baseada em dicionário ativada

  • HBase open source com Snappy

  • MySQL open source com compressão desativada

  • MongoDB open source com Snappy

  • MongoDB open source com zstd

Quando usar compressão baseada em dicionário

zstd versus compressão baseada em dicionário:

Algoritmo

Benefício

Mais indicado para

zstd (padrão)

Redução significativa de armazenamento sem configuração adicional

Todos os tipos de dados

Compressão baseada em dicionário

Redução adicional além do zstd, mediante uma etapa de treinamento do dicionário durante a ingestão de dados

Conjuntos de dados com alta repetição entre linhas

Dados que mais se beneficiam da compressão baseada em dicionário: conjuntos com estrutura repetitiva entre linhas, como entradas de log, campos de telemetria IoV e registros de eventos comportamentais.

Para consultar os resultados consolidados de todos os cenários, veja Resumo.

Pedidos

Conjunto de dados

Este cenário usa o conjunto de dados de benchmark TPC-H, definido pelo Transaction Processing Performance Council (TPC) para avaliar o desempenho de consultas analíticas.

Baixe a ferramenta TPC-H: TPC-H_Tools_v3.0.0.zip

Gere 10 GB de dados de teste:

# Unzip and build the data generator
unzip TPC-H_Tools_v3.0.0.zip
cd TPC-H_Tools_v3.0.0/dbgen
cp makefile.suite makefile

# Edit makefile: set the following fields
# CC = gcc
# DATABASE = ORACLE
# MACHINE = LINUX
# WORKLOAD = TPCH
make

# Generate 10 GB of test data
./dbgen -s 10

Esse processo gera oito arquivos .tbl. Este teste usa o arquivo ORDERS.tbl: 15 milhões de linhas, 1,76 GB.

Campo

Tipo

O_ORDERKEY

INT

O_CUSTKEY

INT

O_ORDERSTATUS

CHAR(1)

O_TOTALPRICE

DECIMAL(15,2)

O_ORDERDATE

DATE

O_ORDERPRIORITY

CHAR(15)

O_CLERK

CHAR(15)

O_SHIPPRIORITY

INT

O_COMMENT

VARCHAR(79)

Crie tabelas de teste

HBase

create 'ORDERS', {NAME => 'f', DATA_BLOCK_ENCODING => 'DIFF', COMPRESSION => 'SNAPPY', BLOCKSIZE => '32768}

MySQL

CREATE TABLE ORDERS (
  O_ORDERKEY      INTEGER NOT NULL,
  O_CUSTKEY       INTEGER NOT NULL,
  O_ORDERSTATUS   CHAR(1) NOT NULL,
  O_TOTALPRICE    DECIMAL(15,2) NOT NULL,
  O_ORDERDATE     DATE NOT NULL,
  O_ORDERPRIORITY CHAR(15) NOT NULL,
  O_CLERK         CHAR(15) NOT NULL,
  O_SHIPPRIORITY  INTEGER NOT NULL,
  O_COMMENT       VARCHAR(79) NOT NULL
);

MongoDB

db.createCollection("ORDERS")

Lindorm

-- lindorm-cli
CREATE TABLE ORDERS (
  O_ORDERKEY      INTEGER NOT NULL,
  O_CUSTKEY       INTEGER NOT NULL,
  O_ORDERSTATUS   CHAR(1) NOT NULL,
  O_TOTALPRICE    DECIMAL(15,2) NOT NULL,
  O_ORDERDATE     DATE NOT NULL,
  O_ORDERPRIORITY CHAR(15) NOT NULL,
  O_CLERK         CHAR(15) NOT NULL,
  O_SHIPPRIORITY  INTEGER NOT NULL,
  O_COMMENT       VARCHAR(79) NOT NULL,
  PRIMARY KEY(O_ORDERKEY)
);

Resultados da compressão

image.png

Banco de dados

Tamanho da tabela

Lindorm (zstd)

784 MB

Lindorm (compressão baseada em dicionário)

639 MB

HBase (Snappy)

1,23 GB

MySQL (sem compressão)

2,10 GB

MongoDB (Snappy)

1,63 GB

MongoDB (zstd)

1,32 GB

IoV

Conjunto de dados

Este cenário usa o conjunto de dados NGSIM (Next Generation Simulation), coletado pela Administração Federal de Rodovias dos EUA a partir de trajetórias de veículos na U.S. Route 101. O NGSIM é amplamente usado em pesquisas sobre comportamento de direção, análise de fluxo de tráfego, previsão de trajetórias veiculares e planejamento de decisões para condução autônoma.

Baixe o arquivo NGSIM_Data.csv: 11,85 milhões de linhas, 1,54 GB, 25 colunas por linha.

Crie tabelas de teste

HBase

create 'NGSIM', {NAME => 'f', DATA_BLOCK_ENCODING => 'DIFF', COMPRESSION => 'SNAPPY', BLOCKSIZE => '32768}

MySQL

CREATE TABLE NGSIM (
  ID             INTEGER NOT NULL,
  Vehicle_ID     INTEGER NOT NULL,
  Frame_ID       INTEGER NOT NULL,
  Total_Frames   INTEGER NOT NULL,
  Global_Time    BIGINT NOT NULL,
  Local_X        DECIMAL(10,3) NOT NULL,
  Local_Y        DECIMAL(10,3) NOT NULL,
  Global_X       DECIMAL(15,3) NOT NULL,
  Global_Y       DECIMAL(15,3) NOT NULL,
  v_length       DECIMAL(10,3) NOT NULL,
  v_Width        DECIMAL(10,3) NOT NULL,
  v_Class        INTEGER NOT NULL,
  v_Vel          DECIMAL(10,3) NOT NULL,
  v_Acc          DECIMAL(10,3) NOT NULL,
  Lane_ID        INTEGER NOT NULL,
  O_Zone         CHAR(10),
  D_Zone         CHAR(10),
  Int_ID         CHAR(10),
  Section_ID     CHAR(10),
  Direction      CHAR(10),
  Movement       CHAR(10),
  Preceding      INTEGER NOT NULL,
  Following      INTEGER NOT NULL,
  Space_Headway  DECIMAL(10,3) NOT NULL,
  Time_Headway   DECIMAL(10,3) NOT NULL,
  Location       CHAR(10) NOT NULL,
  PRIMARY KEY(ID)
);

MongoDB

db.createCollection("NGSIM")

Lindorm

-- lindorm-cli
CREATE TABLE NGSIM (
  ID             INTEGER NOT NULL,
  Vehicle_ID     INTEGER NOT NULL,
  Frame_ID       INTEGER NOT NULL,
  Total_Frames   INTEGER NOT NULL,
  Global_Time    BIGINT NOT NULL,
  Local_X        DECIMAL(10,3) NOT NULL,
  Local_Y        DECIMAL(10,3) NOT NULL,
  Global_X       DECIMAL(15,3) NOT NULL,
  Global_Y       DECIMAL(15,3) NOT NULL,
  v_length       DECIMAL(10,3) NOT NULL,
  v_Width        DECIMAL(10,3) NOT NULL,
  v_Class        INTEGER NOT NULL,
  v_Vel          DECIMAL(10,3) NOT NULL,
  v_Acc          DECIMAL(10,3) NOT NULL,
  Lane_ID        INTEGER NOT NULL,
  O_Zone         CHAR(10),
  D_Zone         CHAR(10),
  Int_ID         CHAR(10),
  Section_ID     CHAR(10),
  Direction      CHAR(10),
  Movement       CHAR(10),
  Preceding      INTEGER NOT NULL,
  Following      INTEGER NOT NULL,
  Space_Headway  DECIMAL(10,3) NOT NULL,
  Time_Headway   DECIMAL(10,3) NOT NULL,
  Location       CHAR(10) NOT NULL,
  PRIMARY KEY(ID)
);

Resultados da compressão

image.png

Banco de dados

Tamanho da tabela

Lindorm (zstd)

995 MB

Lindorm (compressão baseada em dicionário)

818 MB

HBase (Snappy)

1,72 GB

MySQL (sem compressão)

2,51 GB

MongoDB (Snappy)

1,88 GB

MongoDB (zstd)

1,50 GB

Logs

Conjunto de dados

Este cenário usa o conjunto de dados Online Shopping Store - Web Server Logs (Zaker, Farzin, 2019, Harvard Dataverse, V1).

Baixe o arquivo access.log: 10,36 milhões de linhas, 3,51 GB. Cada linha corresponde a uma única entrada de log. Exemplo:

54.36.149.41 - - [22/Jan/2019:03:56:14 +0330] "GET /filter/27|13%20%D9%85%DA%AF%D8%A7%D9%BE%DB%8C%DA%A9%D8%B3%D9%84,27|%DA%A9%D9%85%D8%AA%D8%B1%20%D8%A7%D8%B2%205%20%D9%85%DA%AF%D8%A7%D9%BE%DB%8C%DA%A9%D8%B3%D9%84,p53 HTTP/1.1" 200 30577 "-" "Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)" "-"

Os dados de log apresentam estrutura repetitiva entre as linhas, motivo pelo qual este cenário demonstra os maiores ganhos de compressão com o uso de dicionário.

Crie tabelas de teste

HBase

create 'ACCESS_LOG', {NAME => 'f', DATA_BLOCK_ENCODING => 'DIFF', COMPRESSION => 'SNAPPY', BLOCKSIZE => '32768}

MySQL

CREATE TABLE ACCESS_LOG (
  ID      INTEGER NOT NULL,
  CONTENT VARCHAR(10000),
  PRIMARY KEY(ID)
);

MongoDB

db.createCollection("ACCESS_LOG")

Lindorm

-- lindorm-cli
CREATE TABLE ACCESS_LOG (
  ID      INTEGER NOT NULL,
  CONTENT VARCHAR(10000),
  PRIMARY KEY(ID)
);

Resultados da compressão

image.png

Banco de dados

Tamanho da tabela

Lindorm (zstd)

646 MB

Lindorm (compressão baseada em dicionário)

387 MB

HBase (Snappy)

737 MB

MySQL (sem compressão)

3,99 GB

MongoDB (Snappy)

1,17 GB

MongoDB (zstd)

893 MB

Comportamento de usuários

Conjunto de dados

Este cenário usa o conjunto de dados Shop Info and User Behavior data from IJCAI-15 do Alibaba Cloud Tianchi.

Baixe o arquivo data_format1.zip e use o user_log_format1.csv: 54,92 milhões de linhas, 1,91 GB.

Coluna

Valores de exemplo

user_id

328862

item_id

323294, 844400, 575153

cat_id

833, 1271

seller_id

2882

brand_id

2661

time_stamp

829

action_type

0

Crie tabelas de teste

HBase

create 'USER_LOG', {NAME => 'f', DATA_BLOCK_ENCODING => 'DIFF', COMPRESSION => 'SNAPPY', BLOCKSIZE => '32768}

MySQL

CREATE TABLE USER_LOG (
  ID          INTEGER NOT NULL,
  USER_ID     INTEGER NOT NULL,
  ITEM_ID     INTEGER NOT NULL,
  CAT_ID      INTEGER NOT NULL,
  SELLER_ID   INTEGER NOT NULL,
  BRAND_ID    INTEGER,
  TIME_STAMP  CHAR(4) NOT NULL,
  ACTION_TYPE CHAR(1) NOT NULL,
  PRIMARY KEY(ID)
);

MongoDB

db.createCollection("USER_LOG")

Lindorm

-- lindorm-cli
CREATE TABLE USER_LOG (
  ID          INTEGER NOT NULL,
  USER_ID     INTEGER NOT NULL,
  ITEM_ID     INTEGER NOT NULL,
  CAT_ID      INTEGER NOT NULL,
  SELLER_ID   INTEGER NOT NULL,
  BRAND_ID    INTEGER,
  TIME_STAMP  CHAR(4) NOT NULL,
  ACTION_TYPE CHAR(1) NOT NULL,
  PRIMARY KEY(ID)
);

Resultados da compressão

image.png

Banco de dados

Tamanho da tabela

Lindorm (zstd)

805 MB

Lindorm (compressão baseada em dicionário)

721 MB

HBase (Snappy)

1,48 GB

MySQL (sem compressão)

2,90 GB

MongoDB (Snappy)

3,33 GB

MongoDB (zstd)

2,74 GB

Resumo

O Lindorm atinge uma taxa de compressão superior à dos bancos de dados open source mesmo sem a compressão baseada em dicionário ativada. Com esse recurso, o Lindorm obtém a maior taxa de compressão nos quatro cenários avaliados. Em comparação com os padrões adotados por cada banco de dados open source, o Lindorm com compressão baseada em dicionário reduz o tamanho dos dados armazenados em:

  • 1 a 2 vezes mais que o HBase open source (Snappy)

  • 2 a 4 vezes mais que o MongoDB open source (Snappy ou zstd)

  • 3 a 10 vezes mais que o MySQL open source (sem compressão)

A tabela a seguir consolida todos os resultados dos testes.

Conjunto de dados

Tamanho original

Lindorm (zstd)

Lindorm (dicionário)

HBase (Snappy)

MySQL

MongoDB (Snappy)

MongoDB (zstd)

Dados de pedidos (TPC-H)

1,76 GB

784 MB

639 MB

1,23 GB

2,10 GB

1,63 GB

1,32 GB

Dados IoV (NGSIM)

1,54 GB

995 MB

818 MB

1,72 GB

2,51 GB

1,88 GB

1,50 GB

Dados de log (servidor web)

3,51 GB

646 MB

387 MB

737 MB

3,99 GB

1,17 GB

893 MB

Comportamento do usuário (IJCAI-15)

1,91 GB

805 MB

721 MB

1,48 GB

2,90 GB

3,33 GB

2,74 GB

Escolha entre zstd e compressão baseada em dicionário: o zstd vem ativado por padrão e reduz custos de armazenamento para todos os tipos de dados sem necessidade de configuração adicional. A compressão baseada em dicionário proporciona uma redução ainda maior — mais expressiva em dados de log (387 MB contra 646 MB) e mais modesta em dados IoV com predominância numérica — mediante uma etapa de treinamento do dicionário durante a ingestão dos dados.