25

我不确定使用非常常用的共享列值(如Country)作为复合主键的分区键还是使用相当独特的列值(如Last_Name)是否更好,性能方面。

查看Cassandra 1.2 的有关索引的文档,我得到以下信息:

"何时使用索引:Cassandra 的内置索引最适用于具有许多包含索引值的行的表。特定列中存在的唯一值越多,平均而言,查询和维护索引。例如,假设您有一个包含十亿用户的用户表,并希望通过他们所居住的州来查找用户。许多用户将共享相同的状态列值(例如 CA、NY、TX 等) .). 这将是一个很好的索引候选者。

"何时不使用索引:不要使用索引来查询大量记录以获得少量结果。例如,如果您在具有许多不同值的列上创建索引,则字段之间的查询将招致许多寻求很少的结果。在有十亿用户的表中,通过电子邮件地址(每个用户通常唯一的值)而不是状态来查找用户可能非常低效。将表手动维护为索引形式而不是使用 Cassandra 内置索引可能会更有效。对于包含唯一数据的列,有时为方便起见使用索引在性能方面很好,只要对具有索引列的表的查询量适中且不是处于恒定负载下。”

查看 CQL 的 SELECT 中的示例

查询复合主键和排序结果”,我看到类似 UUID 的东西被用作分区键......这表明最好使用相当独特的东西

在此处输入图像描述

4

3 回答 3

42

您编写的文档中的索引是指二级索引。在 cassandra 中,主索引和辅助索引之间存在差异。对于二级索引,拥有非常独特的值确实很糟糕,但是对于主键中的组件,这取决于我们关注的组件。在主键中,我们有这些组件:

主键(分区键,集群键_1 ...集群键_n)

分区键用于在不同节点之间分配数据,如果您希望节点平衡(即在每个节点之间良好分布数据),那么您希望分区键尽可能随机。这就是您的示例使用 UUID 的原因。

集群键用于排序,以便使用特定集群键查询列的效率更高。这就是你希望你的值不是唯一的地方,如果唯一的行很频繁,就会对性能造成影响。

cql 文档对正在发生的事情有很好的解释。

于 2013-08-12T08:12:59.353 回答
8

如果你使用 cql3,给定一个列族:

CREATE TABLE table1 (
  a1 text,
  a2 text,
  b1 text,
  b2 text,
  c1 text,
  c2 text,
  PRIMARY KEY ( (a1, a2), b1, b2) )
);

通过定义主键 ( (a1, a2, ...), b1, b2, ... )

这意味着:

a1, a2, ... 是用于制作行键的字段,以便:

  • 确定数据如何分区
  • 确定物理上存储在单行中的内容
  • 称为行键或分区键

b1, b2, ... 是用于对行键进行聚类的列族字段,以便:

  • 在单行内创建逻辑集
  • 允许更灵活的搜索方案,例如范围范围
  • 称为列键或簇键

对于列键的每个可能组合,所有剩余字段都被有效地多路复用/复制。下面是一个关于使用分区键和集群键的复合键的示例。

如果你想使用范围查询,你可以使用二级索引或者(从 cql3 开始)你可以将这些字段声明为集群键。就速度而言,将它们作为集群键将创建一个宽行。这会影响速度,因为您将获取多个集群键值,例如:

select * from accounts where Country>'Italy' and Country<'Spain'

于 2013-10-03T15:44:02.767 回答
1

我相信你会得到答案,但这仍然可以帮助你更好地理解。

CREATE TABLE table1 (
  a1 text,
  a2 text,
  b1 text,
  b2 text,
  c1 text,
  c2 text,
  PRIMARY KEY ( (a1, a2), b1, b2) )
);

这里分区键是 (a1, a2),行键是 b1,b2。

对于每个新记录条目,分区键和行键的组合必须是唯一的。

上面的主键可以这样定义。

Node< key, value>

Node<(a1a2), Map< b1b2, otherColumnValues>>

正如我们所知,Partition Key负责跨节点分发数据。

因此,如果您在 table1 中插入 100 条具有相同分区键和不同行键的记录。它将数据存储在同一个节点但在不同的列中。

逻辑上我们可以这样表示。

Node<(a1a2), Map< string1, otherColumnValues>, Map< string2, otherColumnValues> .... Map< string100, otherColumnValues>>

所以记录将按顺序存储在内存中。

于 2015-04-17T14:10:31.780 回答