percona xtradb: compressed columns with …...percona xtradb: compressed columns with dictionaries...

95
Percona XtraDB: Compressed Columns with Dictionaries an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer at Percona

Upload: others

Post on 27-Mar-2020

47 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

Percona XtraDB: Compressed Columns with Dictionaries – an alternative to InnoDB table compression

Yura Sorokin, Senior Software Engineer at Percona

Page 2: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

Existing compression methodsOverview

Page 3: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

3

Existing compression methods for MySQL

• InnoDB Table Compression (starting from 5.1)https://dev.mysql.com/doc/refman/5.7/en/innodb-table-compression.html

• InnoDB Page Compression (starting from 5.7)https://dev.mysql.com/doc/refman/5.7/en/innodb-page-compression.html

• Filesystems with transparent compression (BTRFS, ZFS, NTFS, etc.)will not be covered in this talk

• COMPRESS() / UNCOMPRESS() MySQL functionshttps://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_compresshttps://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_uncompress

• Something intriguing from Percona Server :)something you might have already noticed in the title of this talk

Page 4: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

InnoDB Table CompressionROW_FORMAT=COMPRESSED

Page 5: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

5

InnoDB Table Compression

SET GLOBAL innodb_file_per_table=1;

SET GLOBAL innodb_file_format=Barracuda;

CREATE TABLE tbl (id SERIAL PRIMARY KEY,value BLOB NOT NULL

) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=N;

Based on zlib compression library (LZ77 compression algorithm).

Page 6: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

6

InnoDB Table Compression

• Uncompressed “modification log” records changes made to the page (to avoid unnecessary uncompression and recompression)

• When “modification log” is full, recompression is needed.

• Recompression may fail as compressed data no longer fit and in this case B-tree nodes are split.

• To avoid frequent compression failures (splitting), there is reserved empty space (padding)

Compressed data

Padding

Modification log

Page 7: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

7

InnoDB Table Compression

• BLOB, VARCHAR, and TEXT columns that are not part of the primary key may be stored on separately allocated overflow pages.

• All data written to overflow pages is compressed “as is” (MySQL applies the zlib compression algorithm to the entire data item)

Compressed data

Padding

Modification log

Page 8: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

8

InnoDB Table Compression

Tuning:

• KEY_BLOCK_SIZE=(1|2|4|8|16) combined with innodb_page_size(KEY_BLOCK_SIZE must be <= innodb_page_size)(Table compression does not support 32k and 64k innodb_page_size)

• innodb_compression_level = (0..9)https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_compression_level

• innodb_compression_pad_pct_maxhttps://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_compression_pad_pct_max

• innodb_compression_failure_threshold_pcthttps://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_compression_failure_threshold_pct

Page 9: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

9

InnoDB Table Compression

“…In general, compression works best on tables that include a reasonable number of character string columns and where the data is read far more often than it is written…”https://dev.mysql.com/doc/refman/5.7/en/innodb-compression-tuning.html

Page 10: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

Real world dataJSON documents

Page 11: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

11

Real world data

JSON data sets for JSON Studio tutorialshttp://jsonstudio.com/resources/

• JSON data set of projects funded by the World Bank (436K compressed).

• JSON data set for US zip (postal) codes (656K compressed).

• JSON data set of listed stocks (1.6M compressed).

• JSON data set for Enron emails (3.9M compressed).

• JSON data set of startup company information (14.8M compressed).

‘companies.json’ repeated 8 times

Page 12: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

12

Real world data

{"_id": {

"$oid": "52cdef7c4bab8bd675297d8b“},"name": "AdventNet","permalink": "abc3","crunchbase_url": "http://www.crunchbase.com/company/adventnet","homepage_url": "http://adventnet.com","blog_url": "","blog_feed_url": "","twitter_username": "manageengine","category_code": "enterprise","number_of_employees": 600,"founded_year": 1996,"deadpooled_year": 2,"tag_list": "","alias_list": "Zoho ManageEngine ","email_address": "[email protected]","phone_number": "925-924-9500","description": "Server Management Software","created_at": {

"$date": 1180121062000},"updated_at": "Wed Oct 31 18:26:09 UTC 2012","overview": "<p>AdventNet is now <a href=\"/company/zoho-manageengine\" title=\"Zoho ManageEngine\"

rel=\"nofollow\">Zoho ManageEngine</a>.</p>\n\n<p>Founded in 1996, AdventNet has served a diverse range of enterprise IT, networking and telecom customers.</p>\n\n<p>AdventNet supplies server and network management software.</p>",

Page 13: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

13

Real world data

Loading data from the file

SET max_heap_table_size = 1024 * 1048576;

CREATE TABLE companies_src (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,value LONGTEXT NOT NULL,PRIMARY KEY(id)

) ENGINE=Memory;

LOAD DATA INFILE ‘companies.json' INTO TABLE companies_src FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '' (value);

Page 14: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

14

Real world data

Parsing JSON documents

CREATE TABLE companies_src_parsed(id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,value JSON NOT NULL,PRIMARY KEY(id)

) ENGINE=Memory AS SELECT * FROM companies_src;

Page 15: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

15

Real world data

Statistics:

SELECT COUNT(*) FROM companies_src_parsed;

150408

SELECT COUNT(*) FROM companies_src_parsedWHERE JSON_VALID(value) <> 1;

0

SELECT MIN(LENGTH(value)), ROUND(AVG(LENGTH(value))), MAX(LENGTH(value))

FROM companies_src_parsed;

1027 4160 278016

Page 16: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

16

Real world data

More statistics:

SELECT JSON_KEYS(value) AS keys, JSON_LENGTH(keys)FROM companies_src_parsed ORDER BY id LIMIT 1;

["_id", "name", "image", "offices", "blog_url", "overview", "partners", "products", "tag_list", "permalink", "alias_list", "created_at", "milestones", "updated_at", "acquisition", "description", "founded_day", "investments", "screenshots", "acquisitions", "competitions", "founded_year", "homepage_url", "phone_number", "video_embeds", "blog_feed_url", "category_code", "email_address", "founded_month", "providerships", "relationships", "crunchbase_url", "external_links", "funding_rounds", "deadpooled_year", "twitter_username", "total_money_raised", "number_of_employees"]

38

SELECT MIN(JSON_DEPTH(value)), MAX(JSON_DEPTH(value))FROM companies_src_parsed;

3 7

Page 17: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

InnoDB Table Compression ExperimentsCompression ratio and insertion time

Page 18: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

18

InnoDB Table Compression Experiments

Copying data to a new table:

SET GLOBAL innodb_compression_level = LEVEL;

CREATE TABLE companies_compressed(id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,value LONGTEXT NOT NULL,PRIMARY KEY(id)

) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=KBS;

INSERT INTO companies_compressedSELECT * FROM companies_src;

LEVEL = [0, 1, 6, 9] KBS = [1, 2, 4, 8, 16]

Page 19: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

19

InnoDB Table Compression Experiments

Calculating compressed data size:

SELECT data_length FROM information_schema.tablesWHERE table_schema = DATABASE()

AND table_name = 'companies_compressed’;

Page 20: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

20

InnoDB Table Compression ExperimentsIdentity: Data size, MB and query time, sec

898 880

0

100

200

300

400

500

600

700

800

900

1 000

LONGTEXT JSON

data_length, MB

data_length, MB

33

36

0

5

10

15

20

25

30

35

40

LONGTEXT JSON

query_time, sec

query_time, sec

Page 21: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

21

InnoDB Table Compression ExperimentsIdentity: Data size, % and query time, %

100,00% 98,00%

0,00%

20,00%

40,00%

60,00%

80,00%

100,00%

120,00%

LONGTEXT JSON

data_length_relative, %

data_length_relative, %

100,00%

109,09%

0,00%

20,00%

40,00%

60,00%

80,00%

100,00%

120,00%

LONGTEXT JSON

query_time_relative, %

query_time_relative, %

Page 22: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

22

InnoDB Table Compression ExperimentsData size, MB

898880

749

873

938917

854

898880

359379

338

401

792

898880

341364

317

400

791

898880

341363

316

399

790

0

100

200

300

400

500

600

700

800

900

1 000

LONGTEXT JSON KBS1 KBS2 KBS4 KBS8 KBS16

data_length(LVL0), MB data_length(LVL1), MB data_length(LVL6), MB data_length(LVL9), MB

Page 23: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

23

InnoDB Table Compression ExperimentsQuery time, sec

33

36

64

43

46

27

20

33

3638 37 36

28

21

33

36

43 43

48

34

23

33

36

45 45

52

37

24

0

10

20

30

40

50

60

70

LONGTEXT JSON KBS1 KBS2 KBS4 KBS8 KBS16

query_time(LVL0), sec query_time(LVL1), sec query_time(LVL6), sec query_time(LVL9), sec

Page 24: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

24

InnoDB Table Compression ExperimentsData size, %

10

0,0

0%

98

,00

%

83

,41

%

97

,20

% 10

4,4

3%

10

2,0

6%

95

,10

%

10

0,0

0%

98

,00

%

39

,97

%

42

,23

%

37

,61

% 44

,65

%

88

,20

%

10

0,0

0%

98

,00

%

37

,99

%

40

,48

%

35

,27

% 44

,49

%

88

,08

%

10

0,0

0%

98

,00

%

37

,95

%

40

,45

%

35

,19

% 44

,43

%

87

,97

%

0,00%

20,00%

40,00%

60,00%

80,00%

100,00%

120,00%

LONGTEXT JSON KBS1 KBS2 KBS4 KBS8 KBS16

data_length_relative(LVL0), % data_length_relative(LVL1), % data_length_relative(LVL6), % data_length_relative(LVL9), %

Page 25: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

25

InnoDB Table Compression ExperimentsQuery time, %

10

0,0

0%

10

9,0

9%

19

3,9

4%

13

0,3

0%

13

9,3

9%

81

,82

%

60

,61

%

10

0,0

0%

10

9,0

9%

11

5,1

5%

11

2,1

2%

10

9,0

9%

84

,85

%

63

,64

%

10

0,0

0%

10

9,0

9% 1

30

,30

%

13

0,3

0%

14

5,4

5%

10

3,0

3%

69

,70

%

10

0,0

0%

10

9,0

9%

13

6,3

6%

13

6,3

6% 1

57

,58

%

11

2,1

2%

72

,73

%

0,00%

50,00%

100,00%

150,00%

200,00%

250,00%

LONGTEXT JSON KBS1 KBS2 KBS4 KBS8 KBS16

query_time_relative(LVL0), % query_time_relative(LVL1), % query_time_relative(LVL6), % query_time_relative(LVL9), %

Page 26: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

InnoDB Page CompressionCOMPRESSION=("zlib“ | “lz4”)

Page 27: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

27

InnoDB Page Compression

SET GLOBAL innodb_file_per_table=1;

CREATE TABLE tbl (

id SERIAL PRIMARY KEY,

value BLOB NOT NULL

) ENGINE=InnoDB COMPRESSION=("zlib“ | “lz4”);

Can be configured to use either zlib or lz4 compression.

Page 28: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

28

InnoDB Page Compression

Also referred to as Transparent Page Compressionhttps://dev.mysql.com/doc/refman/5.7/en/innodb-page-compression.html

Requirements:

• Sparse file and hole punching support on Linux

• NTFS on Windows

Page 29: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

29

InnoDB Page Compression

‘ls -l tablespace_name.ibd’ – will show uncompressed file size.

Use ‘du --block-size=1 tablespace_name.ibd’ instead.

SELECT FS_BLOCK_SIZE, FILE_SIZE, ALLOCATED_SIZEFROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES;

Page 30: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

InnoDB Page Compression ExperimentsCompression ratio and insertion time

Page 31: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

31

InnoDB Page Compression Experiments

Copying data to a new table:

SET GLOBAL innodb_compression_level = LEVEL;

CREATE TABLE companies_compressed(id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,value LONGTEXT NOT NULL,PRIMARY KEY(id)

) ENGINE=InnoDB COMPRESSION=‘ALG';

INSERT INTO companies_compressedSELECT * FROM companies_src;

LEVEL = [0, 1, 6, 9] ALG = [zlib, lz4]

Page 32: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

32

InnoDB Page Compression Experiments

Calculating compressed data size:

SELECT allocated_sizeFROM information_schema. innodb_sys_tablespacesWHERE name =

CONCAT(DATABASE(), '/companies_compressed’;

Page 33: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

33

InnoDB Page Compression ExperimentsData size, MB

898880

920

507

898880

434

508

898880

373

506

898880

372

507

0

100

200

300

400

500

600

700

800

900

1 000

LONGTEXT JSON ZLIB LZ4

data_length(LVL0), MB data_length(LVL1), MB data_length(LVL6), MB data_length(LVL9), MB

Page 34: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

34

InnoDB Page Compression ExperimentsQuery time, sec

33

36

18

20

33

36

22

19

33

36

28

19

33

36

30

19

0

5

10

15

20

25

30

35

40

LONGTEXT JSON ZLIB LZ4

query_time(LVL0), sec query_time(LVL1), sec query_time(LVL6), sec query_time(LVL9), sec

Page 35: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

35

InnoDB Page Compression ExperimentsData size, %

10

0,0

0%

98

,00

%

10

2,4

5%

56

,43

%

10

0,0

0%

98

,00

%

48

,36

% 56

,58

%

10

0,0

0%

98

,00

%

41

,59

%

56

,36

%

10

0,0

0%

98

,00

%

41

,37

%

56

,42

%

0,00%

20,00%

40,00%

60,00%

80,00%

100,00%

120,00%

LONGTEXT JSON ZLIB LZ4

data_length_relative(LVL0), % data_length_relative(LVL1), % data_length_relative(LVL6), % data_length_relative(LVL9), %

Page 36: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

36

InnoDB Page Compression ExperimentsQuery time, %

10

0,0

0%

10

9,0

9%

54

,55

%

60

,61

%

10

0,0

0%

10

9,0

9%

66

,67

%

57

,58

%

10

0,0

0%

10

9,0

9%

84

,85

%

57

,58

%

10

0,0

0%

10

9,0

9%

90

,91

%

57

,58

%

0,00%

20,00%

40,00%

60,00%

80,00%

100,00%

120,00%

LONGTEXT JSON ZLIB LZ4

query_time_relative(LVL0), % query_time_relative(LVL1), % query_time_relative(LVL6), % query_time_relative(LVL9), %

Page 37: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

COMPRESS() MySQL functionCOMPRESS() / UNCOMPRESS()

Page 38: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

38

COMPRESS() MySQL function

CREATE TABLE tbl (

id SERIAL PRIMARY KEY,

value BLOB NOT NULL

) ENGINE=<ANY_ENGINE>;

INSERT INTO tbl VALUES

(DEFAULT, COMPRESS(REPEAT(‘a’, 2048)));

SELECT id, UNCOMPRESS(value) FROM tbl;

Page 39: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

39

COMPRESS() MySQL function

• Based on zlib algorithm

• Inconvenient – need to explicitly wrap field names into COMPRESS() / UNCOMPRESS().

• Losing actual field type – compressed fields should be VARBINARY or BLOB.

• No control over compression level.

Page 40: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

COMPRESS() MySQL function ExperimentsCompression ratio and insertion time

Page 41: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

41

COMPRESS MySQL function Experiments

Copying data to a new table:

CREATE TABLE companies_compressed(id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,value LONGBLOB NOT NULL,PRIMARY KEY(id)

) ENGINE=InnoDB;

INSERT INTO companies_compressedSELECT id, COMPRESS(value) FROM companies_src;

Page 42: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

42

COMPRESS MySQL function ExperimentsData size, MB and query time, sec

898880

283

0

100

200

300

400

500

600

700

800

900

1 000

LONGTEXT JSON COMPRESS()

data_length, MB

data_length, MB

33

36

27

0

5

10

15

20

25

30

35

40

LONGTEXT JSON COMPRESS()

query_time, sec

query_time, sec

Page 43: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

43

COMPRESS MySQL function ExperimentsData size, % and query time, %

100,00%98,00%

31,49%

0,00%

20,00%

40,00%

60,00%

80,00%

100,00%

120,00%

LONGTEXT JSON COMPRESS()

data_length_relative, %

data_length_relative, %

100,00%

109,09%

81,82%

0,00%

20,00%

40,00%

60,00%

80,00%

100,00%

120,00%

LONGTEXT JSON COMPRESS()

query_time_relative, %

query_time_relative, %

Page 44: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

XtraDB Compressed ColumnsCOLUMN_FORMAT COMPRESSED

Page 45: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

45

XtraDB Compressed Columns

Availability:

• Percona Server 5.6.33-79.0https://www.percona.com/doc/percona-server/5.6/flexibility/compressed_columns.html

• Percona Server 5.7.17-11https://www.percona.com/doc/percona-server/5.7/flexibility/compressed_columns.html

Page 46: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

46

XtraDB Compressed Columns

Key characteristics:

• It is a data type modifier, independent from user-level SQL and InnoDBdata compression, that causes the data stored in the column to be compressed on writing to storage and decompressed on reading.

• For all other purposes, the data type is identical to the one without the modifier, i.e. no new data types are created.

• Compression is done by using the zlib library.

Page 47: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

47

XtraDB Compressed Columns

CREATE TABLE tbl (

id SERIAL PRIMARY KEY,

value TEXT COLUMN_FORMAT COMPRESSED NOT NULL

) ENGINE=InnoDB;

INSERT INTO tbl VALUES

(DEFAULT, REPEAT(‘a’, 2048));

SELECT id, value FROM tbl;

Page 48: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

48

XtraDB Compressed Columns

Supported data types:

• BLOB (including TINYBLOB, MEDIUMBLOB, LONGBLOG)

• TEXT (including TINYTEXT, MEDIUMTEXT, LONGTEXT)

• VARCHAR (including NATIONAL VARCHAR)

• VARBINARY

Page 49: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

49

XtraDB Compressed Columns

Compressing/uncompressing existing data:

ALTER TABLE tbl CHANGE valuevalue TEXT COLUMN_FORMAT DEFAULT NOT NULL;

ALTER TABLE tbl MODIFYvalue TEXT COLUMN_FORMAT DEFAULT NOT NULL;

ALTER TABLE tbl CHANGE valuevalue TEXT COLUMN_FORMAT COMPRESSED NOT NULL;

ALTER TABLE tbl MODIFYvalue TEXT COLUMN_FORMAT COMPRESSED NOT NULL;

Page 50: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

50

XtraDB Compressed Columns

5.7-specific features:

• Support for compressed JSON data type

• Support for compressed generated stored columns

CREATE TABLE tbl(

id SERIAL PRIMARY KEY,

value JSON COLUMN_FORMAT COMPRESSED NOT NULL

gen TEXT GENERATED ALWAYS AS (value->”$.bio”)

STORED COLUMN_FORMAT COMPRESSED

) ENGINE=InnoDB;

Page 51: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

51

XtraDB Compressed Columns

Tuning:

• innodb_compressed_columns_zip_levelhttps://www.percona.com/doc/percona-server/5.7/flexibility/compressed_columns.html#innodb_compressed_columns_zip_level

• innodb_compressed_columns_threshold = (0..9)https://www.percona.com/doc/percona-server/5.7/flexibility/compressed_columns.html#innodb_compressed_columns_threshold

Page 52: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

52

XtraDB Compressed Columns

Limitations (both for 5.6 and 5.7):

• Compressed columns cannot be used in indices (neither on their own nor as parts of composite keys).

• ALTER TABLE ... DISCARD/IMPORT TABLESPACE is not supported for tables with compressed columns.

Page 53: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

53

XtraDB Compressed Columns

2-bytes compressed blob header:

R W ALGORITHM LEN-LEN C UNUSED

0 1 2 6 7 9 10 11 15

• R – reserved for future versions (currently must always be 0)

• ALGORITHM - identifies which algoritm was used to compress this BLOB. Currently, the only value 0 (meaning zlib) is supported

• W – 'wrap' identifies if compression algorithm calculated a checksum (adler32 in case of zlib) and appended it to the compressed data

• LEN-LEN – identifies the length of the column length data portion followed by this header

Page 54: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

54

XtraDB Compressed Columns

2-bytes compressed blob header:

R W ALGORITHM LEN-LEN C UNUSED

0 1 2 6 7 9 10 11 15

• C – 'compressed’. If set to 1, then this header is immediately followed by 1..8 bytes (depending on the value of LEN-LEN bitfield) which determine original (uncompressed) block size. These LEN-LEN bytes are followed by compressed representation of the original data.

• If 'compressed' bit is set to 0, every other bitfield must be ignored. In this case the header is immediately followed by uncompressed (original) data.

Page 55: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

XtraDB Compressed Columns ExperimentsCompression ratio and insertion time

Page 56: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

56

XtraDB Compressed Columns Experiments

Copying data to a new table:

CREATE TABLE companies_compressed(id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,value [ LONGTEXT | JSON ] COLUMN_FORMAT COMPRESSED

NOT NULL,PRIMARY KEY(id)

) ENGINE=InnoDB;

INSERT INTO companies_compressedSELECT * FROM companies_src;

Page 57: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

57

XtraDB Compressed Columns ExperimentsData size, MB

898880

898880

898880

304

387

898880

284

377

898880

283

377

0

100

200

300

400

500

600

700

800

900

1 000

LONGTEXT JSON COMPRESSED TEXT COMPRESSED JSON

data_length(LVL0), MB data_length(LVL1), MB data_length(LVL6), MB data_length(LVL9), MB

Page 58: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

58

XtraDB Compressed Columns ExperimentsQuery time, sec

33

36

17

36

33

36

22

48

33

36

28

52

33

36

30

53

0

10

20

30

40

50

60

LONGTEXT JSON COMPRESSED TEXT COMPRESSED JSON

query_time(LVL0), sec query_time(LVL1), sec query_time(LVL6), sec query_time(LVL9), sec

Page 59: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

59

XtraDB Compressed Columns ExperimentsData size, %

10

0,0

0%

98

,00

%

10

0,0

0%

98

,00

%

10

0,0

0%

98

,00

%

33

,83

% 43

,08

%

10

0,0

0%

98

,00

%

31

,60

%

41

,97

%

10

0,0

0%

98

,00

%

31

,49

%

41

,97

%

0,00%

20,00%

40,00%

60,00%

80,00%

100,00%

120,00%

LONGTEXT JSON COMPRESSED TEXT COMPRESSED JSON

data_length_relative(LVL0), % data_length_relative(LVL1), % data_length_relative(LVL6), % data_length_relative(LVL9), %

Page 60: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

60

XtraDB Compressed Columns ExperimentsQuery time, %

10

0,0

0%

10

9,0

9%

51

,52

%

10

9,0

9%

10

0,0

0%

10

9,0

9%

66

,67

%

14

5,4

5%

10

0,0

0%

10

9,0

9%

84

,85

%

15

7,5

8%

10

0,0

0%

10

9,0

9%

90

,91

%

16

0,6

1%

0,00%

20,00%

40,00%

60,00%

80,00%

100,00%

120,00%

140,00%

160,00%

180,00%

LONGTEXT JSON COMPRESSED TEXT COMPRESSED JSON

query_time_relative(LVL0), % query_time_relative(LVL1), % query_time_relative(LVL6), % query_time_relative(LVL9), %

Page 61: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

zlib Compression AlgorithmOverview

Page 62: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

62

zlib Compression Algorithm

zlib overviewhttps://en.wikipedia.org/wiki/Zlib

• Only supports one algorithm DEFLATE, that is a variation of LZ77

• LZ77 is a theoretically dictionary coder

• When processing data also keeps track of the most commonly used byte sequences in a dictionary so that those sequences can be referred when occur again in the stream.

Page 63: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

63

zlib Compression Algorithm

zlib compression examples (oversimplified)

Example 1 – no repeating byte sequences

Input : “Sunday Monday Tuesday”

OutDict: {“Sunday”, “Monday”, “Tuesday”}

Output : “Sunday Monday Tuesday”

Very bad compression ratio (100%).

Just put some words into the dictionary.

Page 64: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

64

zlib Compression Algorithm

zlib compression examples (oversimplified)

Example 2 – a lot of byte sequences are repeated

Input : “Sunday Monday Tuesday Tuesday Monday Sunday”

OutDict: {“Sunday”, “Monday”, “Tuesday”}

Output : “Sunday Monday Tuesday \ref[2] \ref[1] \ref[0]”

Good compression ratio (50% + overhead).

For the second half of the input stream dictionary words were used.

Page 65: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

65

zlib Compression Algorithm

zlib compression examples (oversimplified)

Example 3 – an initial state of the dictionary (not ideal) is provided by the user

InDict : {“Sunday”, “Monday”}

Input : “Sunday Monday Tuesday Tuesday Monday Sunday”

OutDict: {“Sunday”, “Monday”, “Tuesday”}

Output : “\ref[0] \ref[1] Tuesday \ref[2] \ref[1] \ref[0]”

Good compression ratio (16% + overhead).

For 5 out of 6 words from the input sequence dictionary references were used. Still not perfect though.

Page 66: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

66

zlib Compression Algorithm

zlib compression examples (oversimplified)

Example 3 – an initial state of the dictionary (ideal) is provided by the user

InDict : {“Sunday”, “Monday”, “Tuesday”}

Input : “Sunday Monday Tuesday Tuesday Monday Sunday”

OutDict: {“Sunday”, “Monday”, “Tuesday”}

Output : “\ref[0] \ref[1] \ref[2] \ref[2] \ref[1] \ref[0]”

Good compression ratio (0% + overhead).

For all the words from the input sequence dictionary references were used. The best results.

Page 67: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

67

zlib Compression Algorithm

Dictionary usage conclusions:

• Compression ratio can significantly depend on whether the initial compression dictionary is provided or not.

• Compression ratio depends on the quality of that dictionary.

Page 68: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

Compressed Columns with Dictionaries

COLUMN_FORMAT COMPRESSED WITH COMPRESSION_DICTIONARY

Page 69: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

69

XtraDB Compressed Columns with Dictionaries

CREATE COMPRESSION_DICTIONARY

dict(’SundayMondayTuesday’);

SET @dict_content = ’SundayMondayTuesday’;

CREATE COMPRESSION_DICTIONARY dict(@dict_content);

DROP COMPRESSION_DICTIONARY dict;

Page 70: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

70

XtraDB Compressed Columns with Dictionaries

CREATE TABLE tbl (

id SERIAL PRIMARY KEY,

value TEXT COLUMN_FORMAT COMPRESSED

WITH COMPRESSION_DICTIONARY dict NOT NULL

) ENGINE=InnoDB;

INSERT INTO tbl VALUES

(DEFAULT, REPEAT(‘a’, 2048));

SELECT id, value FROM tbl;

Page 71: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

71

XtraDB Compressed Columns with Dictionaries

INFORMATION_SCHEMA.XTRADB_ZIP_DICT

• id BIGINT UNSIGNED – compression dictionary ID

• name VARCHAR(64) – compression dictionary name (’dict’ in the example)

• zip_dict BLOB – compression dictionary content (’SundayMondayTuesday’ in the example)

Page 72: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

72

XtraDB Compressed Columns with Dictionaries

INFORMATION_SCHEMA.XTRADB_ZIP_DICT_COLS

• table_id BIGINT UNSIGNED – table ID from INFORMATION_SCHEMA.INNODB_SYS_TABLES

• column_pos BIGINT UNSIGNED – column position (starts from 0 as in INFORMATION_SCHEMA.INNODB_SYS_COLUMNS)

• dict_id BIGINT UNSIGNED – compression dictionary ID

Page 73: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

Generating Compression Dictionary

Keyword histogram

Page 74: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

74

Generating Compression Dictionary

zlib 1.2.11 Manualhttp://www.zlib.net/manual.html

“…The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly used strings preferably put towards the end of the dictionary…”

Page 75: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

75

Generating Compression Dictionary

A table for storing JSON keys

CREATE TABLE extracted_words(

level BIGINT UNSIGNED NOT NULL,

word VARCHAR(255) NOT NULL,

weight BIGINT UNSIGNED NOT NULL,

PRIMARY KEY(level, word)

) ENGINE=InnoDB;

Page 76: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

76

Generating Compression Dictionary

Stored procedure for extracting keys from a JSON value recursivelyCREATE PROCEDURE extract_json_keys_from_tree(IN tree JSON, IN path VARCHAR(255), IN level INT)BEGIN

DECLARE i, n INT;DECLARE tree_keys JSON;DECLARE word VARCHAR(255);SET tree_keys = JSON_KEYS(tree, path);IF tree_keys IS NOT NULL THEN

SET i = 0;SET n = JSON_LENGTH(tree_keys);WHILE i < n DO

SET word = JSON_EXTRACT(tree_keys, CONCAT('$[', i, ']’));INSERT INTO extracted_words

VALUES(level, JSON_UNQUOTE(word), 1) ON DUPLICATE KEY UPDATE weight = weight + 1;CALL extract_json_keys_from_tree(tree, CONCAT(path, '.', word), level + 1);SET i = i + 1;

END WHILE;ELSEIF JSON_CONTAINS_PATH(tree, 'one', CONCAT(path, '[*]')) THEN

SET i = 0;SET n = JSON_LENGTH(tree, path);WHILE i < n DO

CALL extract_json_keys_from_tree(tree, CONCAT(path, '[', i, ']'), level + 1);SET i = i + 1;

END WHILE;END IF;

END

Page 77: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

77

Generating Compression Dictionary

Stored procedure for extracting keys from JSON values stored in a tableCREATE PROCEDURE extract_json_keys_from_table()BEGINDECLARE done BOOLEAN DEFAULT FALSE;DECLARE tree JSON;DECLARE cur CURSOR FOR SELECT value FROM companies_src_parsed

ORDER BY id;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;OPEN cur;read_loop: LOOPFETCH cur INTO tree;IF done THENLEAVE read_loop;

END IF;CALL extract_json_keys_from_tree(tree, '\$', 0);

END LOOP;CLOSE cur;

END

Page 78: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

78

Generating Compression Dictionary

Filling extracted_words with JSON keys from companies_src_parsed

SET max_sp_recursion_depth = 255;

CALL extract_json_keys_from_table();

Page 79: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

79

Generating Compression Dictionary

SELECT * FROM extracted_words;

…1 source_url 26771 stock_symbol 3901 term_code 26771 valuation_amount 3901 valuation_currency_code 3902 acquired_day 44122 acquired_month 44122 acquired_year 44122 address1 16705…

Page 80: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

80

Generating Compression Dictionary

Simplified extracted_words view

SET group_concat_max_len = 32768;

CREATE VIEW extracted_words_simple ASSELECT word, SUM(weight) AS weight,

BIT_OR(POWER(2, level)) AS level_maskFROM extracted_wordsGROUP BY word;

Page 81: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

81

Generating Compression Dictionary

Creating compression dictionaries from keywords of the zero level

SELECT GROUP_CONCAT(word ORDER BY weight,word SEPARATOR ‘’) INTO @res

FROM extracted_words_simple WHERE (level_mask & 1) != 0;

CREATE COMPRESSION_DICTIONARY dict_zero_level(@res);

SELECT GROUP_CONCAT(word ORDER BY weight DESC,word SEPARATOR '') INTO @res

FROM extracted_words_simple WHERE (level_mask & 1) != 0;

CREATE COMPRESSION_DICTIONARY dict_zero_level_reversed(@res);

Page 82: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

82

Generating Compression Dictionary

Creating compression dictionaries from keywords of all levels

SELECT GROUP_CONCAT(word ORDER BY weight,word SEPARATOR ‘’) INTO @res

FROM extracted_words_simple;CREATE COMPRESSION_DICTIONARY dict_all_levels(@res);

SELECT GROUP_CONCAT(word ORDER BY weight DESC,word SEPARATOR ‘’) INTO @res

FROM extracted_words_simple;

CREATE COMPRESSION_DICTIONARY dict_all_levels_reversed(@res);

Page 83: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

Compression with Dictionaries ExperimentsCompression ratio and insertion time

Page 84: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

84

Compression with Dictionaries Experiments

Copying data to a new table:

CREATE TABLE companies_compressed(id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,value LONGTEXT COLUMN_FORMAT COMPRESSED

WITH COMPRESSION_DICTIONARY DICTNOT NULL,

PRIMARY KEY(id)) ENGINE=InnoDB;

INSERT INTO companies_compressedSELECT * FROM companies_src;

DICT = [ dict_zero_level, dict_zero_level_reversed,dict_all_levels, dict_all_levels_reversed ]

Page 85: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

85

Compression with Dictionaries ExperimentsData size, MB

898 898 898 898 898 898898

304280 281 273 276

898

284257 257 252 253

898

283256 257 251 252

0

100

200

300

400

500

600

700

800

900

1 000

LONGTEXT COMPRESSED TEXT DICT ZERO DICT ZERO REV DICT ALL DICT ALL REV

data_length(LVL0), MB data_length(LVL1), MB data_length(LVL6), MB data_length(LVL9), MB

Page 86: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

86

Compression with Dictionaries ExperimentsQuery time, sec

33

1716 16

17 17

33

2221 21 21

22

33

28 28 2829 29

33

30 30 3031

30

0

5

10

15

20

25

30

35

LONGTEXT COMPRESSED TEXT DICT ZERO DICT ZERO REV DICT ALL DICT ALL REV

query_time(LVL0), sec query_time(LVL1), sec query_time(LVL6), sec query_time(LVL9), sec

Page 87: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

87

Compression with Dictionaries ExperimentsData size, %

10

0,0

0%

10

0,0

0%

10

0,0

0%

10

0,0

0%

10

0,0

0%

10

0,0

0%

10

0,0

0%

33

,83

%

31

,16

%

31

,27

%

30

,38

%

30

,71

%

10

0,0

0%

31

,60

%

28

,59

%

28

,59

%

28

,04

%

28

,15

%

10

0,0

0%

31

,49

%

28

,48

%

28

,59

%

27

,92

%

28

,04

%

0,00%

20,00%

40,00%

60,00%

80,00%

100,00%

120,00%

LONGTEXT COMPRESSED TEXT DICT ZERO DICT ZERO REV DICT ALL DICT ALL REV

data_length_relative(LVL0), % data_length_relative(LVL1), % data_length_relative(LVL6), % data_length_relative(LVL9), %

Page 88: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

88

Compression with Dictionaries ExperimentsQuery time, %

10

0,0

0%

51

,52

%

48

,48

%

48

,48

%

51

,52

%

51

,52

%

10

0,0

0%

66

,67

%

63

,64

%

63

,64

%

63

,64

%

66

,67

%

10

0,0

0%

84

,85

%

84

,85

%

84

,85

%

87

,88

%

87

,88

%

10

0,0

0%

90

,91

%

90

,91

%

90

,91

%

93

,94

%

90

,91

%

0,00%

20,00%

40,00%

60,00%

80,00%

100,00%

120,00%

LONGTEXT COMPRESSED TEXT DICT ZERO DICT ZERO REV DICT ALL DICT ALL REV

query_time_relative(LVL0), % query_time_relative(LVL1), % query_time_relative(LVL6), % query_time_relative(LVL9), %

Page 89: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

The most important slideThe best from all worlds

Page 90: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

90

The most important slideData size, MB

898920

938

283

898 898898

434

338

283304

273

898

373

317283 284

252

898

372

316283 283

251

0

100

200

300

400

500

600

700

800

900

1 000

LONGTEXT PAGE ZLIB TABLE KBS4 COMPRESS() COLUMN COMPRESS DICT ALL

data_length(LVL0), MB data_length(LVL1), MB data_length(LVL6), MB data_length(LVL9), MB

Page 91: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

91

The most important slideData size, %

10

0,0

0%

10

2,4

5%

10

4,4

3%

31

,49

%

10

0,0

0%

10

0,0

0%

10

0,0

0%

48

,36

%

37

,61

%

31

,49

%

33

,83

%

30

,38

%

10

0,0

0%

41

,59

%

35

,27

%

31

,49

%

31

,60

%

28

,04

%

10

0,0

0%

41

,37

%

35

,19

%

31

,49

%

31

,49

%

27

,92

%

0,00%

20,00%

40,00%

60,00%

80,00%

100,00%

120,00%

LONGTEXT PAGE ZLIB TABLE KBS4 COMPRESS() COLUMN COMPRESS DICT ALL

data_length_relative(LVL0), % data_length_relative(LVL1), % data_length_relative(LVL6), % data_length_relative(LVL9), %

Page 92: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

92

The most important slideSummary

LVL1 LVL6 LVL9

COLUMN

COMPRESS

33,83

%

31,60

%

31,49

%

DICT ALL 30,38

%

28,04

%

27,92

%

RATIO 89,79

%

88,71

%

88,67

%

-11.33%

Page 93: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

93

Thank You Sponsors!

Page 94: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

94

SAVE THE DATE!

CALL FOR PAPERS OPENING SOON!www.perconalive.com

April 23-25, 2018Santa Clara Convention Center

Page 95: Percona XtraDB: Compressed Columns with …...Percona XtraDB: Compressed Columns with Dictionaries –an alternative to InnoDB table compression Yura Sorokin, Senior Software Engineer

Thank youYou survived 90 slides