全部產品
Search
文件中心

Lindorm:壓縮測試

更新時間:Mar 13, 2025

本文介紹Lindorm在不同情境下與開源HBase、開源MySQL和開源MongoDB之間壓縮能力的對比結果。

背景資訊

Lindorm除多模超融合、開放相容和雲原生彈性等能力外,還具備了高效的資料壓縮能力。Lindorm不僅支援深度最佳化的ZSTD壓縮演算法,還在此基礎上對字典採樣進行了最佳化,進一步減少儲存成本。

本文測試壓縮能力所使用到的資料庫版本及其說明如下:

  • Lindorm:使用阿里雲發行的最新版本。預設使用深度最佳化的ZSTD壓縮演算法,支援開啟字典壓縮。

  • 開源HBase:使用2.3.4版本。在有高版本Hadoop支撐的情況下支援ZSTD壓縮演算法,但不穩定且易發生進程崩潰現象(Core Dump)。絕大部分自建HBase使用者使用SNAPPY壓縮演算法。

  • 開源MySQL:使用8.0版本。預設不開啟資料壓縮。MySQL雖然支援ZLIB壓縮演算法,但由於開啟資料壓縮後會對查詢效能產生嚴重影響,因此MySQL使用者基本不會開啟資料壓縮。

  • 開源MongoDB:使用5.0版本。預設使用SNAPPY壓縮演算法,同時支援將SNAPPY演算法替換為ZSTD演算法。

本文選取了訂單、車連網、日誌和使用者行為這四個在Lindorm中常見的情境,使用真實的資料集分別測試了Lindorm預設壓縮、Lindorm開啟字典壓縮、HBase使用SNAPPY演算法壓縮、MySQL不開啟壓縮、MongoDB使用SNAPPY演算法壓縮和MongoDB使用ZSTD演算法壓縮這六種方式的壓縮能力。

各情境下的測試對比結果匯總及測試結論請參見測試對比結果

訂單情境

資料準備

該情境使用TPC-H資料集進行壓縮測試。TPC-H是業界常用的一套基準程式,由TPC委員會制定發布,用於評測資料庫的分析型查詢能力。

重要

本測試並未完全依照<TPC benchmark name>基準測試規範,而是基於該測試規範進行了修改。本測試結果不能等同於完全遵守<TPC benchmark name>測試規範所獲得的測試結果,因此不能與完全遵守該測試規範獲得的測試結果進行對比。

TPC-H程式下載

下載檔案TPC-H_Tools_v3.0.0.zip

產生資料

# unzip TPC-H_Tools_v3.0.0.zip
# cd TPC-H_Tools_v3.0.0/dbgen
# cp makefile.suite makefile
# vim makefile
################產生Oracle資料庫的指令碼和資料,主要修改以下欄位
CC = gcc
DATABASE = ORACLE
MACHINE = LINUX
WORKLOAD = TPCH
################
# make  --產生dbgen
# ./dbgen -s 10  --產生10GB資料

執行完成後會在目前的目錄下產生8個.tbl格式的檔案,每一個檔案對應一張表。選擇ORDERS.tbl檔案進行壓縮測試,檔案大小為1.76 GB,共有資料1500萬行,對應表結構如下:

Field

Type

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)

建表

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));

壓縮效果對比

image..png

資料庫

Lindorm

(預設壓縮)

Lindorm

(字典壓縮)

HBase

(SNAPPY)

MySQL

MongoDB

(預設SNAPPY)

MongoDB

(ZSTD)

表大小

784 MB

639 MB

1.23 GB

2.10 GB

1.63 GB

1.32 GB

車連網情境

該情境使用NGSIM資料集。NGSIM(Next Generation Simulation)是由美國聯邦公路局發起的一項資料擷取專案,廣泛應用於車輛的跟馳和換道等駕駛行為的研究、交通串流分析、微觀交通模型構建、車輛運動軌跡預測和自動駕駛決策規劃等。所有資料來源於美國高速公路國道101上的實際運行軌跡採集。

資料準備

搜尋並下載資料集檔案NGSIM_Data.csv。檔案大小1.54GB,共有資料1185萬行,每行25列。資料結構的詳細介紹及下載方式,請參見NGSIM資料集

建表

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)) ;

壓縮效果對比

image

資料庫

Lindorm

(預設壓縮)

Lindorm

(開啟字典壓縮)

HBase

(SNAPPY)

MySQL

MongoDB

(預設SNAPPY)

MongoDB

(ZSTD)

表大小

995 MB

818 MB

1.72 GB

2.51 GB

1.88 GB

1.50 GB

日誌情境

使用Web伺服器訪問日誌資料集:Zaker, Farzin, 2019, "Online Shopping Store - Web Server Logs", https://doi.org/10.7910/DVN/3QBYB5, Harvard Dataverse, V1

資料準備

日誌資料集網頁下載記錄檔access.log。檔案大小為3.51GB,共有資料1036萬行,日誌資料格式樣本如下:

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/)" "-"

建表

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));

壓縮效果對比

image..png

資料庫

Lindorm

(預設壓縮)

Lindorm

(字典壓縮)

HBase

(SNAPPY)

MySQL

MongoDB

(SNAPPY)

MongoDB

(ZSTD)

表大小

646 MB

387 MB

737 MB

3.99 GB

1.17 GB

893 MB

使用者行為

該情境使用來自阿里雲天池的資料集:Shop Info and User Behavior data from IJCAI-15

資料準備

使用者行為資料集網頁下載data_format1.zip,並選用user_log_format1.csv檔案,檔案大小為1.91 GB,共有資料5492萬行。檔案結構樣本如下:

user_id

item_id

cat_id

seller_id

brand_id

time_stamp

action_type

328862

323294

833

2882

2661

829

0

328862

844400

1271

2882

2661

829

0

328862

575153

1271

2882

2661

829

0

建表

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));

壓縮效果對比

image..png

資料庫

Lindorm

(預設壓縮)

Lindorm

(字典壓縮)

HBase

(SNAPPY)

MySQL

MongoDB

(SNAPPY)

MongoDB

(ZSTD)

表大小

805 MB

721 MB

1.48 GB

2.90 GB

3.33 GB

2.74 GB

總結

通過上述對比可以得知,在不同的情境下,面對類型不同且資料量較大的資料,即使不開啟字典壓縮,Lindorm的壓縮比相較於其他開來源資料庫也有明顯的優勢。在開啟了字典壓縮之後,Lindorm的壓縮效果更加突出,壓縮效果幾乎是開源HBase的1~2倍,開源MongoDB的2~4倍,開源MySQL的3~10倍

各情境下的測試對比結果匯總如下:

資料

檔案大小

Lindorm

(預設壓縮)

Lindorm

(字典壓縮)

HBase

(SNAPPY)

MySQL

MongoDB

(SNAPPY)

MongoDB

(ZSTD)

訂單資料

(TPC-H)

1.76 GB

784 MB

639 MB

1.23 GB

2.10 GB

1.63 GB

1.32 GB

車連網資料(NGSIM)

1.54 GB

995 MB

818 MB

1.72 GB

2.51 GB

1.88 GB

1.50 GB

日誌資料

(server log)

3.51 GB

646 MB

387 MB

737 MB

3.99 GB

1.17 GB

893 MB

使用者行為資料(IJCAI-15)

1.91 GB

805 MB

721 MB

1.48 GB

2.90 GB

3.33 GB

2.74 GB