Cassandra中这两种表的区别是什么?
第一:
CREATE TABLE data (
sensor_id int,
collected_at timestamp,
volts float,
volts2 float,
PRIMARY KEY (sensor_id, collected_at,volts )
)
第二:
CREATE TABLE data (
sensor_id int,
collected_at timestamp,
volts float,
volts2 float,
PRIMARY KEY ((sensor_id, collected_at),volts )
)
我的问题:
- 这两张桌子有什么区别
- 我们什么时候使用第一张桌子,什么时候使用第二张桌子
差异是主要的关键。Cassandra主键分为(Partition key,Clustering key)。
分区键决定寄存器在环中的位置,集群决定具有相同分区键的寄存器的存储方式,以利用查询中列的磁盘排序。
第一个表:
- Sensor_id是您的分区密钥,因此您知道具有相同Sensor_id的每个寄存器都将转到同一节点
- 您有两个集群键,collected_at和volts字段,因此具有相同sensor_id的数据将按collected_a特字段升序存储,而具有相同sendor_id、collected_at字段的数据将按照volts字段升序存储
第二表:
- 您将有一个复合分区密钥(sensor_id,collected_at),这样您就知道具有相同sensor_id和collected_at的每个寄存器都将转到同一节点
- 您的集群密钥是伏特,所以具有相同(sensor_id,collected_at)的数据将按伏特升序存储
想象一下,同一个sensor_id有数十亿个寄存器。使用第一种方法,您将把它存储在同一个节点中,因此可能会耗尽空间。如果使用第二种方法,则必须使用精确的sensor_id和collected_at时间戳进行查询,因此这可能没有意义。正因为如此,在Cassandra建模中,在创建模型之前,您必须知道要执行哪些查询。
第一个表仅对sensor_id
上的数据进行分区。这意味着每个sensor_id
下面的所有数据都存储在同一个数据分区中。sensor_id
的散列令牌值还决定了数据分区存储在集群中的哪个节点上。每个分区内的数据按collected_at
和volts
排序。
第二个表使用sensor_id
和collected_at
上的复合键来确定数据分区。每个分区中的数据按volts
进行排序。
我们什么时候使用第一张表,什么时候使用第二张表?
由于您必须在查询中传递所有分区键,第一个表提供了更多的查询灵活性。也就是说,您可以决定只在sensor_id
上查询,然后您可以选择是否也按collected_at
查询,然后按volts
查询。在第二个表中,有要通过sensor_id
和collected_at
进行查询。因此,您的查询灵活性较低,但您可以从第二个模型中获得更好的数据分布。
实际上,对时间戳(第二表)值进行分区通常不是很有用,因为在执行查询之前,必须具有确切的时间戳。通常,当在分区键中使用时间戳组件时,您会看到一种称为"日期桶"的技术,在这种技术中,您会使用精度较低的东西,如月或日。这样,你仍然可以查询整个月/天,或者你的水桶是什么。