我有5列的表。
1. ID - number but it can stored as text or number
2. name - text
3. date - date value but can stored as date or text
4. time - number but it can stored as text or number
5. rating - number but it can stored as text or number
我想找到哪种数据类型可以使我的表更快写入。我怎么能找到。任何卡桑德拉都会为此施加压力吗?
答案 0 :(得分:3)
关于@ BryceAtNetwork23提供的answer,它与Cassandra 2.1或Cassandra 2.2相同(但Cassandra 3.0可能会因为团队目前正在重写存储引擎而不同,请参阅{{3 }})。存储的数据仍以二进制形式存储。
然而,还有更多话要说。您可能需要考虑存储的实际数据,项目需要实现的性能,每秒查询等等。
根据这些目标或限制,一个有趣的方法是查看给定CASSANDRA-8099的序列化数据的大小。
如果数据是一个数字,例如Java中long
的大小为8字节,那么&#sa;是匹配cassandra bigint
类型的大小,这意味着序列化时没有相关的成本,普通副本就可以。此外,这还有一个好处,即密钥足够小,因此它不会压力 cassandra密钥缓存。
如果数据是一段文本,例如Java中的String
,它在运行时以UTF-16编码,但在使用text
类型的Cassandra中序列化时使用UTF-8。 UTF-16总是每个字符使用2个字节 ,有时使用4个字节,但UTF-8节省空间,并且根据字符长度可以是1,2,3或4个字节。
这意味着有CPU工作来序列化这些数据以进行编码/解码。同样取决于例如158786464563
的文本,数据将以12个字节存储。这意味着使用更多空间和更多IO。
注意cassandra提供遵循US-ASCII字符集的ascii
类型,并始终使用type on cassandra。
如果数据是UUID(值为128位),则在Java中,UUID
类型使用2 long
s,因此长度为16个字节,Cassandra将它们存储为16个字节(1 byte per character)。
同样,这总是取决于项目的里程数,目标是什么,现有的限制因素。但这是未受过教育的选项:
[−9,223,372,036,854,775,808 ; +9,223,372,036,854,775,807]
内的数字,我将获得bigint
类型text
不是问题,但如果是,或者如果使用量增加,我会避免如果可能的话,text
为密钥。另一种选择是使用blob
类型,即二进制类型,根据软件业务,可以按照您想要的方式使用任何数据。这可以实现节省空间,IO高效存储以及CPU效率。但是根据需要,可能需要在客户端代码中管理很多东西,比如排序,序列化,比较,映射等......