在表中使用多个映射类型时,Datastax Cassandra的性能下降

时间:2014-06-04 21:16:49

标签: cassandra datastax-enterprise cassandra-2.0 datastax

我有下表有五个地图类型集合。集合中的最大元素数为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

2 个答案:

答案 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运算符来查询人员表