说我按以下顺序在卡桑德拉中插入三行
ID,firstname, lastname, websitename
1:fname1, lname1, site1
2:fname2, lname2, site2
3:fname3, lname3, site3
列存储将列存储在一起,如下所示:
1:fname1,2:fname2,3:fname3
1:lname1,2:lname2,3:lname3
1:site1,2:site2,3:site3
这是否意味着当我插入第一行,即1:fname1, lname1, site1
时,它将为所有三列将每一列放在单独的磁盘块中,以便
在firstname列中必须在某些查询中读取。所有相关的列数据都在单个块上?
因为Cassandra必须将数据存储在3个块中,而不是将其存储在3个块中以确保将列数据组合在一起,这不会使写入变慢吗?
答案 0 :(得分:1)
Cassandra不是经典的列存储。它将所有插入/更新的数据存储在一起,首先按分区键组织,然后按群集列/主键在分区内。在不同的时间点更新数据时,数据可能位于不同的SSTables中,但是压缩过程最终将尝试将它们合并在一起。
如果您有兴趣,可以对数据文件使用const
,并查看数据的存储方式。还有一个very good blog post from The Last Pickle about storage engine in the Cassandra 3.0(与以前的版本不同)。
答案 1 :(得分:1)
Cassandra不是面向列的数据库,而是分区行存储,这意味着示例中的数据将按以下方式存储: >
"YourTable" : {
row1 : { "ID":1, "firstname":"fname1", "lastname":"lname1", "websitename":"site1", "timestamp":1582988571},
row2 : { "ID":2, "firstname":"fname2", "lastname":"lname2", "websitename":"site2", "timestamp":1582989563}
row3 : { "ID":3, "firstname":"fname3", "lastname":"lname3", "websitename":"site3", "timestamp":1582989572}
...
}
根据主键(分区键,可以包含一个或多个聚类键)对数据进行分组和搜索。
要考虑的一些事情:
答案 2 :(得分:0)
Cassandra基本上是一个列族数据库或行分区数据库,并且具有列信息,而不是基于列/基于列/列的数据库。在插入/获取时,我们需要提及partition(aka行键,aka主键)列信息。我们可以在任何时间添加任何列。
像Cassandra这样的列族存储非常有用,如果您具有高吞吐量写入并且希望能够线性地水平扩展。
术语“列族”来自原始存储引擎,它是键/值存储,其中值是列/值元组的“族”。每个键可以具有的列数没有硬性限制。