宽列数据库如何在存储布局上实现动态列?
How wide-columns databases achieve dynamic columns on the storage layout?
众所周知,在关系数据库中,添加新列时,必须重新分配数据 (ALTER TABLE without locking the table?) 以在磁盘上保持单个行连续。
我想了解这是如何在 Cassandra 等宽列存储上实现的,这些存储是稀疏的并且可以处理大量动态列插入(http://www.datastax.com/dev/blog/thrift-to-cql3(动态列族))
谢谢!
在 Cassandra 中添加列有点像在关系数据库中添加行。您甚至可以删除特定行的列:
delete first_name from user where user_id='abcd';
在 CQL 中,alter table
不会修改所有行,简而言之,它只是修改描述表的模式字典(查看 system
键中前缀为 schema_
的表space).这仅更改 CQL 解析(现在可以识别新列)和解释(select * from user
含义已更改)。
当您删除一列时,数据不再出现在查询结果中,但它仍然存在于 SSTables 中。在未来的压缩(如墓碑)期间,数据将被删除(并 space 释放)。
众所周知,在关系数据库中,添加新列时,必须重新分配数据 (ALTER TABLE without locking the table?) 以在磁盘上保持单个行连续。
我想了解这是如何在 Cassandra 等宽列存储上实现的,这些存储是稀疏的并且可以处理大量动态列插入(http://www.datastax.com/dev/blog/thrift-to-cql3(动态列族))
谢谢!
在 Cassandra 中添加列有点像在关系数据库中添加行。您甚至可以删除特定行的列:
delete first_name from user where user_id='abcd';
在 CQL 中,alter table
不会修改所有行,简而言之,它只是修改描述表的模式字典(查看 system
键中前缀为 schema_
的表space).这仅更改 CQL 解析(现在可以识别新列)和解释(select * from user
含义已更改)。
当您删除一列时,数据不再出现在查询结果中,但它仍然存在于 SSTables 中。在未来的压缩(如墓碑)期间,数据将被删除(并 space 释放)。