Cassandra-按聚簇键搜索

时间:2018-10-08 09:23:27

标签: database cassandra nosql

这是我的diseases表定义:

id text,
drugid text,
name
PRIMARY KEY (drugid, id)

现在,我只想按drugid列执行搜索(此列中的所有值都是唯一的)。这个主键是由于药物快速搜索而创建的。

现在-使用id过滤此表的最佳解决方案是什么?创建新表?将附加值(drugid传递给SELECT?是否只有id选项?

感谢您的帮助:)

1 个答案:

答案 0 :(得分:2)

查看表定义,分区键为Drugid。这意味着您的查询将必须包含药物名。但是由于id也是主键的一部分,因此您可以执行以下操作:

select * from diseases where drugid = ? and id = ?

不幸的是,除非您在其上创建二级索引,否则仅具有ID是不可能的。那样不好,因为您可能会触发整个群集扫描。

因此,解决方案是:

  • 指定分区键(如果可能的话),在这种情况下为药典
  • 创建一个新表,将id作为分区键;在这种情况下,您将需要维护两个表;

我猜您会选择哪种解决方案取决于您的数据集。您应该测试一下每种解决方案的行为。

您应该使用二级索引吗?

指定分区键时,Cassandra将从分区和仅从一个节点读取确切的数据。

创建二级索引时,Cassandra需要从分布在整个群集中的分区中读取数据。当在具有许多不同值的列上建立索引时,会对性能产生影响。这是有关此问题的更多阅读内容-规模级的Cassandra:The Problem with Secondary Indexes

在以上文章中,@ doanduyhai发表了一个有趣的评论:

  

“只有1种情况下,二级索引可以很好地执行   不受扩展性问题的影响:与   分区键。如果您确保所有查询都使用辅助查询   索引的格式为:

SELECT ... FROM ... WHERE partitionKey=xxx AND my_secondary_index=yyy
  

那么您就可以放心了。更好的是   如果您可以混入许多二级索引。性能方面,因为   所有索引读取都将在节点本地进行,应该没问题”

我会远离二级索引。

根据您的描述,id或多或少会有不同的值,因此您可能会遇到性能问题,因为“一般的经验法则是索引基数少的低列”。

此外,如果id是集群列,则数据将以有序方式存储。群集列仅在分区键内确定数据在磁盘上的排序顺序。默认顺序为ASC。

我建议多读一些书-When not to use an indexUsing a secondary index