Cassandra Primary Key讲解

在抽象设计模型时,我们常常需要面对另外一个问题,那就是如何指定各Column Family所使用的各种键。在Cassandra相关的各类文档中,我们常常会遇到以下一系列关键的名词:Partition Key,Clustering Key,Primary Key以及Composite Key。那么它们指的都是什么呢?

  Primary Key实际上是一个非常通用的概念。在Cassandra中,其表示用来从Cassandra中取得数据的一个或多个列:

1 create table sample (
2     key text PRIMARY KEY,
3     data text
4 );

  在上面的示例中,我们指定了key域作为sample的PRIMARY KEY。而在需要的情况下,一个Primary Key也可以由多个列共同组成:

1 create table sample {
2     key_one text,
3     key_two text,
4     data text,
5     PRIMARY KEY(key_one, key_two)
6 };

  在上面的示例中,我们所创建的Primary Key就是一个由两个列key_one和key_two组成的Composite Key。其中该Composite Key的第一个组成被称为是Partition Key,而后面的各组成则被称为是Clustering Key。Partition Key用来决定Cassandra会使用集群中的哪个结点来记录该数据,每个Partition Key对应着一个特定的Partition。而Clustering Key则用来在Partition内部排序。如果一个Primary Key只包含一个域,那么其将只拥有Partition Key而没有Clustering Key。

  Partition Key和Clustering Key同样也可以由多个列组成:

复制代码
1 create table sample {
2     key_primary_one text,
3     key_primary_two text,
4     key_cluster_one text,
5     key_cluster_two text,
6     data text,
7     PRIMARY KEY((key_primary_one, key_primary_two), key_cluster_one, key_cluster_two)
8 };
复制代码

  而在一个CQL语句中,WHERE等子句所标示的条件只能使用在Primary Key中所使用的列。您需要根据您的数据分布决定到底哪些应该是Partition Key,哪些应该作为Clustering Key,以对其中的数据进行排序。

  一个好的Partition Key设计常常会大幅提高程序的运行性能。首先,由于Partition Key用来控制哪个结点记录数据,因此Partition Key可以决定是否数据能够较为均匀地分布在Cassandra的各个结点上,以充分利用这些结点。同时在Partition Key的帮助下,您的读请求应尽量使用较少数量的结点。这是因为在执行读请求时,Cassandra需要协调处理从各个结点中所得到的数据集。因此在响应一个读操作时,较少的结点能够提供较高的性能。因此在模型设计中,如何根据所需要运行的各个请求指定模型的Partition Key是整个设计过程中的一个关键。一个取值均匀分布的,却常常在请求中作为输入条件的域,常常是一个可以考虑的Partition Key。

  除此之外,我们也应该好好地考虑如何设置模型的Clustering Key。由于Clustering Key可以用来在Partition内部排序,因此其对于包含范围筛选的各种请求的支持较好。

你可能感兴趣的:(Cassandra Primary Key讲解)