YDB 数据类型与表级异构存储

总所周知,企业级的固态硬盘(SSD)价格数倍于机械硬盘,一般高达 10:1 。为了追求性价比,我们会对数据区别对待,只将对性能影响最大的数据存储在固态硬盘上。为了实现这个功能,YDB 提供了表级的异构存储。

YDB 表级异构存储本质上就是为数据表底层文件扩展名指定不同的存储策略,即部分扩展名文件存储在固态硬盘,其他扩展名文件存储在机械硬盘。而数据表底层文件扩展名是由 Lucene 引擎决定的,与数据类型紧密相关。如果了解 Lucene 索引机制,就可以根据需要设置扩展名的存储策略。

但对像我这样的 Lucene 小白如何选取存储策略?这里通过实验获得了不同类型数据对应不同扩展名的存储空间大小,结合 YDB 数据类型的应用场景,试图定性的分析各“功能”占用的存储位置,为存储策略的选取提供参考。

实验设计

数据表底层文件扩展名及其大小与数据类型紧密相关,因此采用一个表只含有一个字段的方式,测试各数据类型与文件扩展名的关系。

数据类型选取数值型、字符型和分词型,其中每种类型还对应存储方式。具体的选取类型见下表:

No. 数据类型 存储方式 说明
1 y_long_i 仅索引 整形 64 位,范围查找性能低
2 y_long_d 仅列存 同上
3 y_long_s 仅行存 同上
4 y_tlong_i 仅索引 整形 64 位, 适合大范围的 range 过滤查询
5 y_tlong_d 仅列存 同上
6 y_tlong_s 仅行存 同上
7 y_string_i 仅索引 字符串类型,不分词
8 y_string_d 仅列存 同上
9 y_string_s 仅行存 同上
10 y_ydblikebig_ip 仅索引 全文检索, 可以在 like 中进行顺序匹配
11 y_ydblikebig_sp 仅行存 同上
12 y_ydbtextbig_i 仅索引 全文检索, 不能在 like 中进行顺序匹配
13 y_ydbtextbig_s 仅索引 同上

每个数据类型建两个表,一个为低维值列(10个),一个为高维值列(1,000个),每个表的总行数为100,000行。低维值列的伪造方法是,先生成10个不同的单元值样本,随机选取插入表中,样本见下表。高纬值列伪造方法相似。

No. 数值型 字符型 或 分词型
1 436491 qoackxqvyxlpktmd
2 312602 nddaisljiccnljlx
3 789688 dayarjmyxbwyesst
4 958174 yfvxrurjouygivho
5 941345 xayueotawerprlfe
6 931928 rxeeinbwyyjjikyc
7 101295 xrrpynhpnmhmwiop
8 222082 hgmyljmdwighigyy
9 503768 ermjyacynuxivhtn
10 517582 pywlksuwipnbfeby

结果及分析

实测的表名与文件扩展名大小(字节)关系见下表,表名中low代表低维值列,high代表高维值列,表名后半部分代表字段类型。

table_name seg si fnm fdx fdt dvm dvd doc tip tim pos skp
t_low_y_long_i 136 514 879 1846 561799 309 37605 98860 195 575 - -
t_low_y_long_d 136 514 881 1944 561943 421 87608 18150 171 350 - -
t_low_y_long_s 136 514 808 1944 1002315 309 37605 18150 171 350 - -
t_low_y_tlong_i 136 514 879 1162 564546 309 37605 273619 195 902 - -
t_low_y_tlong_d 136 514 881 1846 561827 421 87608 18150 171 350 - -
t_low_y_tlong_s 136 514 808 1944 1002286 309 37605 18150 171 350 - -
t_low_y_string_i 136 514 879 1846 561847 309 37605 98780 195 635 - -
t_low_y_string_d 136 514 881 1846 561849 372 87768 18150 171 350 - -
t_low_y_string_s 136 514 808 1260 1019506 309 37605 18150 171 350 - -
t_low_y_ydblikebig_ip 140 442 524 355 514119 309 37605 1353665 189 3908 39892 91162
t_low_y_ydblikebig_sp 136 514 808 1944 1020202 309 37605 18150 171 350 - -
t_low_y_ydbtextbig_i 136 514 879 1846 562683 309 37605 1387817 212 2973 - -
t_low_y_ydbtextbig_s 136 514 808 1260 1020227 309 37605 18150 171 350 - -
t_high_y_long_i 136 514 879 1846 562630 309 37605 205935 306 7554 - -
t_high_y_long_d 136 514 881 1846 562581 348 287608 18150 171 350 - -
t_high_y_long_s 136 514 808 1260 1266455 309 37605 18150 171 350 - -
t_high_y_tlong_i 136 514 879 1846 562802 309 37605 497417 492 12829 - -
t_high_y_tlong_d 136 514 881 1846 562571 348 287608 18150 171 350 - -
t_high_y_tlong_s 136 514 808 1944 1266303 309 37605 18150 171 350 - -
t_high_y_string_i 136 514 879 1846 562635 309 37605 205914 433 19673 - -
t_high_y_string_d 136 514 881 1846 562709 373 203608 18150 171 350 - -
t_high_y_string_s 136 514 808 1358 2446393 309 37605 18150 171 350 - -
t_high_y_ydblikebig_ip 140 442 524 337 513574 309 37605 3166025 1316 205621 1530598 20331
t_high_y_ydblikebig_sp 136 514 808 2140 2446352 309 37605 18150 171 350 - -
t_high_y_ydbtextbig_i 140 435 524 337 513596 309 37605 3072164 1264 173662 - 17525
t_high_y_ydbtextbig_s 136 514 808 2140 2446288 309 37605 18150 171 350 - -

从高维值列的统计信息中,可以明显看到行存、列存、索引和偏移量对应底层文件的扩展名:

  • “行存”: 数据主要存储在扩展名为 fdt 的文件中
  • “列存”: 数据主要存储在扩展名为 dvd 的文件中
  • “索引”: 数据主要存储在扩展名为 doc 和 tim 的文件中
  • 分词类型中的“索引”:数据还会额外占用扩展名为 skp 的文件
  • 分词类型中带“偏移量”的“索引”:数据还会额外占用扩展名为 pos 的文件

对比高维值列和低维值列,可以看出:

  • “行存”:列的维值对数据大小影响不大
  • “列存”:列的维值对数据大小影响较大,低维值列占用空间较少
  • “索引”:列的维值对数据大小影响较大,低维值列占用空间较少
  • “pos”:列的维值对数据大小影响较大,低维值列占用空间较少
  • “skp”:列的维值对数据大小影响较大,低维值列时可以不需要该文件

总结

本文测试了各数据类型与数据表底层文件的对应关系,分析行存、列存、索引和偏移量对应底层文件的扩展名,并简述了列维值对文件大小的影响,为表级异构存储策略的选取提供参考。

如果进一步阅读《YDB编程指南全解》可以了解数据类型及行存、列存、索引和偏移量在数据库查询中的作用。

  • 公司: 沈阳延云云计算技术有限公司
  • 官网: http://ycloud.net.cn
  • 电话:400-188-4800
  • QQ群: 521648211

你可能感兴趣的:(YDB 数据类型与表级异构存储)