如何计算Cassandra中blob、map<text,text>等数据类型大小及单元格平均大小?
Cassandra 数据类型大小计算与平均大小估算示例
以下是针对你关注的text/varchar、blob、list、set、map<text,text>类型的具体大小计算方法和估算示例,同时包含平均大小的统计思路:
1. Text/Varchar 类型
Cassandra存储text/varchar时,会额外添加4字节的长度前缀(用于标识字符串的UTF-8编码字节数),总大小公式:
总字节数 = 4(长度前缀) + 字符串的UTF-8编码字节数
- 单值示例:
- 英文串
"Hello Cassandra":15个字符(UTF-8占15字节),总大小=4+15=19字节 - 混合串
"Cassandra 中文测试":英文部分10字节+中文4字符×3字节=22字节,总大小=4+22=26字节
- 英文串
- 平均大小估算:先统计样本的平均字符数,乘以对应场景的平均字节/字符(比如中英文混合取2字节/字符),再加4字节。例:平均20字符的混合串,平均大小=4 + 20×2=44字节
2. Blob 类型
blob直接存储二进制数据,同样带4字节的长度前缀,总大小公式:
总字节数 = 4(长度前缀) + 二进制数据实际字节数
- 单值示例:
- 10KB图片(10240字节):总大小=4+10240=10244字节
- 500字节加密数据:总大小=4+500=504字节
- 平均大小估算:统计样本中二进制数据的平均字节数,再加4字节即可。例:平均2KB的文件,平均大小=4+2048=2052字节
3. List 类型
List是有序集合,存储开销包括:
- 4字节的元素数量前缀
- 每个元素额外加2字节的索引前缀(标记元素顺序)
- 每个元素本身的
text大小(4字节长度前缀+UTF-8编码字节数)
总大小公式:
总字节数 = 4(元素数前缀) + Σ(2(索引前缀) + 4(元素长度前缀) + 元素UTF-8字节数)
- 单值示例:
List内容:["apple", "banana", "樱桃"]- "apple":2+4+5=11字节;"banana":2+4+6=12字节;"樱桃":2+4+6=12字节
- 总大小=4 + 11+12+12=39字节
- 平均大小估算:4 + 平均元素数 × (2 + 单text平均大小)。例:平均5个元素,每个text平均20字节,平均大小=4 +5×(2+20)=114字节
4. Set 类型
Set是无序不重复集合,无需索引前缀,存储开销:
- 4字节的元素数量前缀
- 每个元素的
text大小(4字节长度前缀+UTF-8编码字节数)
总大小公式:
总字节数 = 4(元素数前缀) + Σ(4(元素长度前缀) + 元素UTF-8字节数)
- 单值示例:
Set内容:{"apple", "banana", "樱桃"}- "apple":4+5=9字节;"banana":4+6=10字节;"樱桃":4+6=10字节
- 总大小=4 +9+10+10=33字节
- 平均大小估算:4 + 平均元素数 × 单text平均大小。例:平均4个元素,每个text平均20字节,平均大小=4+4×20=84字节
5. Map<Text, Text> 类型
Map是键值对集合,存储开销:
- 4字节的键值对数量前缀
- 每个键值对的大小=键的
text大小 + 值的text大小
总大小公式:
总字节数 = 4(键值对数量前缀) + Σ(键的text大小 + 值的text大小)
- 单值示例:
Map内容:{"name": "Alice", "age": "25", "城市": "北京"}- "name"+"Alice":(4+4)+(4+5)=17字节;"age"+"25":(4+3)+(4+2)=13字节;"城市"+"北京":(4+6)+(4+6)=20字节
- 总大小=4 +17+13+20=54字节
- 平均大小估算:4 + 平均键值对数量 × (平均键大小 + 平均値大小)。例:平均3个键值对,平均键10字节、平均値15字节,平均大小=4+3×(10+15)=79字节
实际获取平均大小的方法
如果需要精确统计已有数据的平均大小,可以使用:
nodetool tablehistograms <keyspace>.<table>:查看目标列的大小分布直方图,提取平均值- 在
cqlsh中通过SELECT blobAsText(column) FROM ...导出数据后,计算每个值的字节数再取平均
内容的提问来源于stack exchange,提问作者Panda153
相关产品推荐
相关产品推荐

