Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Cassandra中使用复合主键可降低插入时间_C#_Cassandra - Fatal编程技术网

C# 在Cassandra中使用复合主键可降低插入时间

C# 在Cassandra中使用复合主键可降低插入时间,c#,cassandra,C#,Cassandra,我一直在和卡桑德拉一起工作,我遇到了一些绊脚石。关于我需要如何搜索数据,我发现复合主键对于我所需要的内容非常有效,但该列族中记录的插入时间与它有关,我不完全确定原因 表定义: CREATE TABLE exampletable ( clientid int, filledday int, filledtime bigint, id uuid, ...etc... PRIMARY KEY (clientid, filledday, filledtime, id) ); clientid=客户端的

我一直在和卡桑德拉一起工作,我遇到了一些绊脚石。关于我需要如何搜索数据,我发现复合主键对于我所需要的内容非常有效,但该列族中记录的插入时间与它有关,我不完全确定原因

表定义:

CREATE TABLE exampletable (
clientid int,
filledday int,
filledtime bigint,
id uuid,
...etc...
PRIMARY KEY (clientid, filledday, filledtime, id)
);
clientid=客户端的内部id。filledday=自1900年1月1日起的天数。Filled Time=接收记录当天的滴答声数。id=一个Guid

日和时间结构的存在是因为我需要能够轻松快速地过滤日

我知道Cassandra以完全不同的方式存储具有复合主键的列族。据我所知,它将把所有内容存储为主键主组件基行的新列。这就是插入速度慢的原因吗?当我说slow时,我的意思是,如果我在id上有一个主键,那么插入将需要大约200毫秒,而使用复合主键(或者它的任何子集,我尝试了clientid和id,效果相同),1000条记录将需要32秒以上的时间。在复合键表之外,选择时间更快,因为我必须应用二级索引并使用“允许筛选”,以便使用标准键表获取正确的记录(我知道我可以在代码中这样做,但问题是我处理的是一些海量数据集,这并不总是实用或可能的)


对于我尝试执行的操作,是否声明列族或主键错误?对于所有未列出的非主键列,表有37列宽,这会是问题吗?在这一点上我感到很困惑。我还没有找到任何关于其他人有类似问题的信息

好的,您的分区键是客户机id,因此每个客户机的所有写入操作都将转到一个节点。如果您要为每个客户机写入大量数据,那么最终可能会出现一个热点,从而降低总体吞吐量

另外,您能举一个您运行的查询的例子吗?在Cassandra中,数据模型总是需要类似于要运行的查询。如果您需要“允许过滤”,那么您的数据模型似乎不太合适。例如,我真的看不出你PK中“filledtime”的意义。如果要按时间段进行查询,只需将三列键替换为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');
从clientid=123和ts>minTimeuuid('2013-06-18 16:23:00')和ts
同样,这取决于您实际需要运行的查询

最后,对于数据建模的总体指导,请查看。阅读它帮我澄清了一些事情


希望有帮助

好的,您的分区键是客户机id,因此每个客户机的所有写入操作都将转到一个节点。如果您要为每个客户机写入大量数据,那么最终可能会出现一个热点,从而降低总体吞吐量

另外,您能举一个您运行的查询的例子吗?在Cassandra中,数据模型总是需要类似于要运行的查询。如果您需要“允许过滤”,那么您的数据模型似乎不太合适。例如,我真的看不出你PK中“filledtime”的意义。如果要按时间段进行查询,只需将三列键替换为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');
从clientid=123和ts>minTimeuuid('2013-06-18 16:23:00')和ts
同样,这取决于您实际需要运行的查询

最后,对于数据建模的总体指导,请查看。阅读它帮我澄清了一些事情


希望有帮助

以查询为例,我需要能够执行以下操作:1)为客户获取一天的记录2)为客户获取一个日期和时间的记录。我之所以使用filledday和filledTime,主要是因为我的代码库是.Net,并且TimeUUID没有内置函数。我现在有些东西,所以我要试试看。我现在看到的问题是,我需要找到一个密钥结构,它允许我在不了解客户机和时间的情况下执行这些查询,但仍然可以充分分割数据,以避免插入速度变慢。注意:数据集非常大。我建议使用我上面提出的结构,并使用timeuuid。为了避免热点,您可以简单地添加一个随机整数(从预定义的范围(如0-9)并形成一个复合分区键,如下所示:
createtableexampletable(clientid int,bucket,intid timeuuid,…PRIMARY key((clientid,bucket),id))
从示例中选择*,其中clientid=123,bucket IN(0,1,2,3,4,5,6,7,8,9)和ts>minTimeuuid('2013-06-18 00:00:01')和ts对于一个查询示例,我需要能够执行以下操作:1)获取客户一天的记录2)获取客户一天的记录。我之所以使用filledday和filledTime,主要是因为我的代码库是.Net,并且TimeUUID没有内置函数。我现在有些东西,所以我要试试看。我现在看到的问题是,我需要找到一个密钥结构,它允许我在不了解客户机和时间的情况下执行这些查询,但仍然可以充分分割数据,以避免插入速度变慢。注意:数据集非常大。我建议使用我上面提出的结构,并使用timeuuid。为了避免热点,你可以