繁体   English   中英

Cassandra中使用复合主键的插入时间慢

[英]Slow Insert Time With Composite Primary Key in Cassandra

我一直在与Cassandra合作,遇到了一些绊脚石。 对于如何搜索数据,我发现复合主键可以很好地满足我的需求,但是此列族中记录的插入时间却很麻烦,我不完全知道为什么。

表定义:

CREATE TABLE exampletable (
clientid int,
filledday int,
filledtime bigint,
id uuid,
...etc...
PRIMARY KEY (clientid, filledday, filledtime, id)
);

clientid =客户端的内部ID。 filledday =自1900年1月1日以来的天数。 filltime =记录被获取的当天的滴答数。 id =向导。

之所以存在日期和时间结构,是因为我需要能够轻松快速地按日进行过滤。

我知道Cassandra用复合主键存储列系列的方式完全不同。 据我了解,它将所有内容存储为主键主要组件的基本行的新列。 这是插入缓慢的原因吗? 当我说慢时,我的意思是,如果我仅在id上有一个主键,则插入将花费〜200毫秒,并且使用复合主键(或它的任何子集,我只尝试了clientid和id来达到相同的效果),它将花费长达32秒以获取1000条记录。 从复合键表中选择时间更快,因为我必须应用二级索引并使用“ ALLOW FILTERING”才能用标准键表返回正确的记录(我知道我可以在代码中做到这一点,但关注点是我正在处理一些海量数据集,而这些数据集并不总是可行或不可能的)。

我是在声明列族或主键错误吗? 对于所有未列出的非主键列,表的宽度为37列,这是问题所在吗? 在这一点上,我很沮丧。 我无法真正找到关于其他有类似问题的人的任何信息。

好吧,您的分区键是客户端ID,因此每个客户端的所有写入都转到一个节点。 如果每个客户端要写入大量数据,则可能会遇到热点,从而降低整体吞吐量。

另外,您能否举一个运行查询的例子? 在Cassandra中,数据模型始终需要类似于您要运行的查询。 如果您需要“允许过滤”,那么您的数据模型似乎不太正确。 例如,我在您的PK中看不到“ filledtime”的意义。 如果要按时间段查询,只需用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');

同样,这将取决于您实际需要运行的查询。

最后,有关数据建模的总体指导,请访问此ebay技术博客 阅读它有助于我为我整理一些东西。

希望有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM