我一直在与Cassandra合作,我遇到了一些绊脚石。对于我需要如何搜索数据,我发现复合主键非常适合我需要的东西,但是这个列系列中的记录的插入时间会带给它的狗,我不完全确定原因。
表定义:
CREATE TABLE exampletable (
clientid int,
filledday int,
filledtime bigint,
id uuid,
...etc...
PRIMARY KEY (clientid, filledday, filledtime, id)
);
clientid =客户端的内部ID。 filledday =自19/1/19以来的天数。 filledtime =记录被记录日的刻度数。 id = A Guid。
存在日期和时间结构,因为我需要能够轻松快速地过滤白天。
我知道Cassandra使用复合主键存储Column Families的方式完全不同。根据我的理解,它将把所有内容存储为主键主要组件的基本行的新列。这是插入速度慢的原因吗?当我说慢时,我的意思是如果我在id上只有一个主键,插入将花费大约200毫秒,并且使用复合主键(或其任何子集,我尝试了clientid和id以达到相同的效果)它将需要1000条记录超过32秒。选择时间比复合键表更快,因为我必须应用二级索引并使用'ALLOW FILTERING'以便使用标准键表返回正确的记录(我知道我可以在代码中执行此操作,但关注的是我正在处理一些海量数据集,并不总是实用或可行的。
我是否因为我要做的事情而宣布列族或主键错误?对于所有未列出的非主键列,表格为37列宽,这是问题吗?在这一点上我很难过。我无法真正找到其他有类似问题的人。
答案 0 :(得分:1)
好吧,您的分区键是客户端ID,因此每个客户端的所有写入都转到一个节点。如果您为每个客户端编写大量数据,最终可能会出现热点,从而降低整体吞吐量。
另外,您能举例说明您运行的查询吗?在Cassandra中,数据模型始终需要与您要运行的查询类似。如果您需要“允许过滤”,那么您的数据模型似乎并不完全正确。例如,我并没有真正看到PK中的“填充时间”。如果要按时间段查询,只需使用TimeUUID列“ts”替换三个列键。这将创建一个宽行,每个条目一列,具有唯一的时间戳,每个客户端ID集群/分区。 这允许查询:
select * from exampletable where clientid = 123 and ts > minTimeuuid('2013-06-18 16:23:00') and ts < minTimeuuid('2013-06-18 16:24:00');
同样,这取决于您实际需要运行的查询。
最后,有关数据建模的总体指导,请查看this ebay tech blog。阅读它帮助我为我清理了一些东西。
希望有所帮助!