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文档有什么事情的一个很好的解释.
如果你使用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'
| 归档时间: |
|
| 查看次数: |
24796 次 |
| 最近记录: |