Cassandra Skinny vs Wide Row的时间序列 - 消费

时间:2017-06-09 13:25:00

标签: cassandra time-series consumption

我想将每一秒的值存储到一个表中。因此,我互相测试两个方法。如果我理解正确,数据应该在内部存储几乎相同。

宽行

CREATE TABLE timeseries (
  id int,
  date date,
  timestamp timestamp,
  value decimal,
  PRIMARY KEY ((id, date), timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC) AND
  compaction={'class': 'DateTieredCompactionStrategy'} 
   and  compression = { 'sstable_compression' : 'DeflateCompressor' };

瘦行

  CREATE TABLE timeseries(
    id int,
    date date,
    "0" decimal, "1" decimal,"2" decimal, -- ... 86400 decimal values
                   -- each column index is the second of the day
    PRIMARY KEY ((id, date))
) 

测试:

  • 10个不同的身份
  • 100万个值(每个ID 100.000)
  • 每个值增加一分钟

results of the comparison in values


enter image description here

在我的测试中,用于窦功能的瘦行方法仅占用了100万个值的一半存储空间。即使是随机测试也很重要。有人可以解释这种行为吗?

1 个答案:

答案 0 :(得分:2)

这些架构之间的唯一区别是单元格键

宽行模型的样本单元格:

["2017-06-09 15\\:05+0600:value","3",1496999149885944]
          |                 |     |          |
       timestamp         column  value   timestamp

Skinny行模型的示例单元格:

   ["0","3",1497019292686908]
     |   |          | 
  column value   timestamp

您可以清楚地看到宽行模型单元格键是值的时间戳值和列名称。而对于瘦模型,单元格键只是列名。

宽行模型的开销是时间戳(8个字节)和列名(值)的大小。你可以保持列名小,而不是使用时间戳,使用int并输入当天的秒数,如你瘦的行列名。这将节省更多空间。