在表中使用多个地图类型时Datastax卡桑德拉性能下降(Performance degradati

2019-10-20 05:26发布

我有五个地图类型集合下表。 集合中的元素的最大数为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记录插入和性能下降(超出200毫秒/ OP)作为插入的记录数量的增加。 从OpsCenter我看到帕新的垃圾收集时间增加(超出20毫秒)作为被插入的记录。

现在,如果我改变与像PRIMARY KEY不同的主键的表(PERSONID,treeid)和做同样的插入,性能要好得多(低于1毫秒/ OP)和垃圾收集时间远低于1毫秒

那么,为什么是分区键,使这里的性能差异? 我与treeid其他表,PERSONID作为主键但任何地图数据的类型和他们的表现非常好。 我想进行基于treeid查询,我应该如何能做到这一点? 我应该把地图分成不同的表? 或创建在treeid柱辅助索引? 什么阅读更有效率?

我使用datastax企业4.0.1。 卡桑德拉2.0.5。 我在CentOS 6.4和3复制因子的三个节点群集

Answer 1:

在主键提到的第一个柱被称为分区键。 在主键提到的任何附加列被称为聚类列。 所有聚类列对于给定的分区键的被存储为单个卡桑德拉分区(保证是一起在单个节点上) - 过去被称为“宽行”。 因此,每个treeid将涉及单个分区,每个PERSONID开始分区中的行。

有多少treeid的,你呢? 如果你有一个小数目树IDS和人数众多的,这将导致一个非常小的数目卡桑德拉分区,每个分区有大量行的(传统的宽行。)

随意阐述你正在尝试用这种树ID做的,但表面上听起来好像人id是分区键是更好的选择。

或者......也许你真的想要一个“复合分区键”:

PRIMARY KEY((绿树浓荫,PERSONID))

因此那棵树ID和个人ID的组合来区分分区。

这取决于你如何真的想组织你的数据。



Answer 2:

最后我现在改变性能数据模型和它的要好得多。 我创建了两个表来代替。

创建表personids(treeid INT,PERSONID长,PRIMARY KEY(treeid,PERSONID))

创建表的人(........ PRIMARY KEY(PERSONID))

所以,我会插入到两个表,并在查询我查询personids从personids一棵树,然后查询个人表与这些personids。 我用IN操作符来查询个人表



文章来源: Performance degradation with Datastax Cassandra when using multiple map types in a table