我有下表有五个地图类型集合。集合中的最大元素数为12,项目的最大大小为50字节。
CREATE TABLE persons (
treeid int,
personid bigint,
birthdate text,
birthplace text,
clientnote text,
clientnoteisprivate boolean,
confidence int,
connections map<int, bigint>,
createddate timestamp,
deathdate text,
deathplace text,
familyrelations map<text, text>,
flags int,
gender text,
givenname text,
identifiers map<int, text>,
issues int,
media map<uuid, int>,
mergedpersonas map<int, bigint>,
note text,
primaryphotoid uuid,
quality int,
suffix text,
surname text,
userid uuid,
vitalstatus int,
PRIMARY KEY (treed,personid)
)
这里我的分区键是treeid,唯一键是personid。我试图使用datastax .net驱动程序从.net应用程序将记录插入此表。我插入大约200K记录,随着插入记录数量的增加,性能下降(超过200ms / op)。从Opscenter中我看到,随着记录的插入,Par New垃圾收集时间增加(超过20毫秒)。
现在,如果我使用不同的主键(如PRIMARY KEY(personid,treeid))更改表并执行相同的插入,性能会更好(低于1 ms / op),垃圾收集时间远低于1 ms
那么,为什么分区键在这里的性能有所不同?我有其他表与treeid,personid作为主键但没有任何地图数据类型,他们表现很好。 我想基于treeid执行查询,我应该怎么做?我应该把地图带到不同的桌子吗?或者在treeid列上创建二级索引?阅读效率更高?
我正在使用datastax enterprise 4.0.1。 cassandra 2.0.5。我在centos 6.4上有一个三节点集群,复制因子为3
答案 0 :(得分:1)
主键中提到的第一列称为分区键。主键中提到的任何其他列都称为群集列。给定分区键的所有聚类列都存储为单个Cassandra分区(保证在一个节点上一起) - 过去被称为&#34;宽行&#34;。因此,每个treeid将引用一个分区,每个personid在分区内开始一行。
你有多少树?如果你有少量的树ID和大量的人,那么就会产生非常少量的Cassandra分区,每个分区都有大量的行(传统的宽行)。
随意详细说明您尝试使用此树ID进行操作,但从表面上看,这听起来好像是人物ID是分区键的更好选择。
或者......也许你真的想要一个&#34;复合分区键&#34;:
PRIMARY KEY((treed,personid))
因此,使用树ID和人员ID的组合来区分分区。
这取决于您真正想要如何组织数据。
答案 1 :(得分:0)
我最终改变了数据模型,现在性能要好得多。我改为创建了两个表。
创建表人员(treeid int,personid long,PRIMARY KEY(treeid,personid))
创建表人(........ PRIMARY KEY(personid))
因此,我将插入到两个表中,同时查询我从personids查询personids的人员,然后使用这些personid查询人员表。我使用IN运算符来查询人员表