Cassandra:选择分区键

and*_*and 23 cassandra database-partitioning composite-primary-key database-indexes

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

看看Cassandra 1.2关于索引的文档,我得到了这个:

" 何时使用索引:Cassandra的内置索引最适合包含索引值的许多行的表.特定列中存在的唯一值越多,平均而言,查询和查询的开销就越大.维护索引.例如,假设您有一个拥有十亿用户的用户表,并希望按照他们所居住的状态查找用户.许多用户将共享相同的状态列值(例如CA,NY,TX等) .).这将是一个指数的良好候选人. "

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

查看CQL的SELECT for 中的示例

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

在此输入图像描述

Lyu*_*rov 40

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

PRIMARY KEY(分区键,群集key_1 ...群集key_n)

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

群集密钥用于排序,以便使用特定群集密钥查询列可以更有效.在这里,您希望您的值不是唯一的,并且如果频繁使用唯一行,那么性能会受到影响.

CQL文档有什么事情的一个很好的解释.

  • @RavindranathAkila聚类键会影响列在物理节点中的对齐方式(排序),但您在节点之间的分配仅取决于分区键是正确的. (2认同)

nat*_*usa 8

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

CREATE TABLE table1 (
  a1 text,
  a2 text,
  b1 text,
  b2 text,
  c1 text,
  c2 text,
  PRIMARY KEY ( (a1, a2), b1, b2) )
);
Run Code Online (Sandbox Code Playgroud)

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

这意味着:

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

  • 确定数据的分区方式
  • 确定在单行中存储的是什么
  • 称为行键或分区键

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

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

对于每个可能的列密钥组合,所有剩余的字段被有效地多路复用/复制.下面是一个关于具有分区键和聚类键的复合键的示例.

如果要使用范围查询,可以使用辅助索引或(从cql3开始)可以将这些字段声明为聚类键.在速度方面,将它们作为聚类键将创建一个宽行.这会影响速度,因为您将获取多个群集键值,例如:

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

  • 辅助索引有效地创建由所选列分区的散列行密钥的二叉树.列键用于索引行内的列.仅当列值的基数较低时才应使用二级指数(例如国家或邮政编码) (2认同)