Cassandra:选择分区键

Cassandra:选择分区键,cassandra,composite-primary-key,database-partitioning,database-indexes,Cassandra,Composite Primary Key,Database Partitioning,Database Indexes,我还不确定使用一个非常常见的共享列值(如Country)作为复合主键的分区键,还是使用一个非常独特的列值(如Last\u Name)更好,性能更好 看看我得到的: “何时使用索引: Cassandra的内置索引是最好的 包含索引值的多行。越唯一 存在于特定列中的值,开销越大 平均而言,您可以查询和维护索引。例如, 假设您有一个拥有10亿用户的用户表,并且想要查看 根据用户居住的州对用户进行分类。许多用户将共享相同的数据 状态的列值(如CA、NY、TX等)。这将是一个 索引的最佳候选。“ “不使用

我还不确定使用一个非常常见的共享列值(如
Country
)作为复合主键的分区键,还是使用一个非常独特的列值(如
Last\u Name
)更好,性能更好

看看我得到的:

何时使用索引: Cassandra的内置索引是最好的 包含索引值的多行。越唯一 存在于特定列中的值,开销越大 平均而言,您可以查询和维护索引。例如, 假设您有一个拥有10亿用户的用户表,并且想要查看 根据用户居住的州对用户进行分类。许多用户将共享相同的数据 状态的列值(如CA、NY、TX等)。这将是一个 索引的最佳候选。

不使用索引时: 不要使用索引来查询大量记录以获取少量数据 结果数。例如,如果在列上创建索引 如果具有许多不同的值,则会在字段之间进行查询 许多人追求的结果很少。在拥有10亿用户的表格中, 通过用户的电子邮件地址查找用户(该值通常为 对于每个用户来说都是唯一的)而不是根据他们的状态,可能是非常重要的 效率低下。手动维护可能更有效 将表作为索引的形式,而不是使用Cassandra 内置索引。对于包含唯一数据的列,有时 良好的性能明智地使用索引,只要 对具有索引列的表的查询量适中,并且不是很高 在恒定载荷下。”

为了

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


您编写的文档中的索引是指辅助索引。在卡桑德拉有一个很好的例子。对于二级索引来说,拥有非常唯一的值确实是不好的,但是对于主键中的组件来说,这取决于我们关注的组件。在主键中,我们有以下组件:

主键(分区键、群集键\u 1…群集键\u n)

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

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


如果使用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>“意大利”和Country我相信您会得到答案,但这仍然可以帮助您更好地理解

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>>
Node<(a1a2), Map< string1, otherColumnValues>, Map< string2, otherColumnValues> .... Map< string100, otherColumnValues>>
节点
节点>
正如我们所知,分区键负责跨节点的数据分发

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

逻辑上我们可以这样表示

Node< key, value>

Node<(a1a2), Map< b1b2, otherColumnValues>>
Node<(a1a2), Map< string1, otherColumnValues>, Map< string2, otherColumnValues> .... Map< string100, otherColumnValues>>
节点,映射。。。。映射>

因此,记录将按顺序存储在内存中。

我想知道使用集群键和范围查询时的性能。该文档非常明确地表示只使用二级索引进行相等性比较,因为范围比较将使用Cassandra迭代结果进行比较(由于键索引)。你知道吗?使用聚类键(即不构成行/分区键的主键部分)的范围查询是如何进行的?二级索引有效地创建了由所选列分区的哈希行键组成的二叉树。而列键用于索引行中的列。仅当列值的基数较低(例如国家或邮政编码)时才应使用二级索引主键((a1),b1,b2))与主键(a1,b1,b2)相同。可以使用聚类语法加快复合/复合主键中的列键,例如:使用聚类顺序by(b1 DESC);在这种情况下,降序查询将比升序查询更快。如果您愿意,这将非常有用