Cassandra中的数据建模,可以是文本或数字

时间:2015-06-20 19:26:16

标签: cassandra datastax-enterprise

我有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

我想找到哪种数据类型可以使我的表更快写入。我怎么能找到。任何卡桑德拉都会为此施加压力吗?

1 个答案:

答案 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类型
  • UUID很好
  • 如果群集负载不重(例如每秒100k查询)并且空间不是问题,那么text不是问题,但如果是,或者如果使用量增加,我会避免如果可能的话,text为密钥。

另一种选择是使用blob类型,即二进制类型,根据软件业务,可以按照您想要的方式使用任何数据。这可以实现节省空间,IO高效存储以及CPU效率。但是根据需要,可能需要在客户端代码中管理很多东西,比如排序,序列化,比较,映射等......