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。。。用于创建行键的字段,以便:
- 确定数据的分区方式
- 确定物理存储在一行中的内容
- 称为行键或分区键
- 在单行内创建逻辑集
- 允许更灵活的搜索方案,如范围
- 称为列键或群集键
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);在这种情况下,降序查询将比升序查询更快。如果您愿意,这将非常有用