2013-07-24 78 views
0

我一直在与卡桑德拉和我已经打了一下一个绊脚石。对于我是多么需要在数据搜索,我发现一个复合主键我需要什么,而是在此列家庭记录插入的时间去与它的狗的伟大工程,我不完全知道为什么。缓慢插入时间与复合主键在卡桑德拉

表定义:

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

的clientid =客户端的内部ID。 filledday =自1/1/1900以来的天数。 filledtime =记录被收回当天的滴答数。 id =一个Guid。

的日期和时间结构的存在是因为我需要能够白天方便,快捷地进行筛选。

我知道有复合主键完全不同卡桑德拉商店列族。从我的理解它会保存一切,离主键的主要成分的基行的新列。这是插入缓慢的原因吗?当我说慢我的意思是,如果我只是在ID上的主键插入将需要约200毫秒,并与复合主键(或任何其子集,我只是clientid和ID试图相同的效果),它会采取1000条记录超过32秒。选择时间快于复合键表,因为我必须应用二级索引并使用'ALLOW FILTERING'以便用标准键表获得正确的记录(我知道我可以在代码中执行此操作,但问题是我正在处理一些海量的数据集,并不总是实际或可能的)。

难道我宣布柱族或主键错了什么,我想干什么?对于所有未列出的非主键列,该表的列宽为37列,这是否会成为问题?我很困惑这一点。我无法真正找到其他有类似问题的人。

回答

0

那么,你的分区键是客户端ID,所以每个客户端都写入到一个节点。如果你正在编写大量的每个客户端的数据,你可能最终与热点,从而降低您的总吞吐量。

此外,您还可以给您运行查询的例子吗?在Cassandra中,数据模型总是需要类似于您想要运行的查询。如果你需要“允许过滤”,那么你的数据模型看起来不太正确。例如,我没有在你的PK中看到“充实时间”这一点。如果要按时间段查询,只需用TimeUUID列“ts”替换三个列键。这将创建一个宽行,每一个条目的列有独特timestam,集群/每客户端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。读它帮助我为我清理了一些东西。

希望有帮助!

+0

对于查询的一个例子,我需要能够做的事情一样得到以下几点:1)获取一个客户记录每天 2)获取记录的日期和时间的客户端。 我正在使用填满和填充时间主要是因为我的代码库是.Net,并没有建立在timeuuids的功能。我现在有一些东西,所以我给他们一个尝试。我现在看到这个问题的方式是我需要找到一个关键结构,它可以让我在不了解客户和时间的情况下完成这些查询,但仍然可以将数据分开以便不会使插入变慢。注意:数据集非常大。 – Bozarth

+0

我建议使用我上面提出的结构,并使用[.NET客户端,如fluentcassandra](https://github.com/fluentcassandra/fluentcassandra)来使用TimeUUID。 为了避免热点可以很容易地只添加一个随机整数(从预定义的范围等0-9),并形成像这样的复合分区键: 'CREATE TABLE exampletable( 的clientid INT, 桶,整数 ID timeuuid , ... PRIMARY KEY((客户端ID,桶),ID) );' 'SELECT * FROM exampletable其中的clientid = 123和铲斗IN(0,1,2,3,4,5,6 ,7,8,9)和ts> minTimeuuid('2013-06-18 00:00:01')和ts omnibear