Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra 数据建模(二级索引与聚类键)_Cassandra_Data Modeling - Fatal编程技术网

Cassandra 数据建模(二级索引与聚类键)

Cassandra 数据建模(二级索引与聚类键),cassandra,data-modeling,Cassandra,Data Modeling,我想知道如果我选择的话,这是否会成为一个性能问题 备选案文1: 非常高的唯一值列作为分区键(order_id),并在store_id和status上创建索引。(我可以查询订单|门店|标识|状态|门店和状态,也可以根据订单|标识***更新(重要)状态) 备选案文2: 将_id存储为分区_键,将非常高的唯一值列存储为集群键(order_id),并在状态上创建二级索引(以便我可以在状态上进行筛选) (我可以查询门店id |门店和订单id |门店和状态|,也可以**根据门店和订单id更新状态) 我想知道

我想知道如果我选择的话,这是否会成为一个性能问题 备选案文1: 非常高的唯一值列作为分区键(order_id),并在store_id和status上创建索引。(我可以查询订单|门店|标识|状态|门店和状态,也可以根据订单|标识***更新(重要)状态)

备选案文2: 将_id存储为分区_键,将非常高的唯一值列存储为集群键(order_id),并在状态上创建二级索引(以便我可以在状态上进行筛选) (我可以查询门店id |门店和订单id |门店和状态|,也可以**根据门店和订单id更新状态)


我想知道在上述场景中会出现哪些性能问题。哪一个是更好的选择。非常感谢您的帮助和时间。

选项1很有趣,但您需要小心使用索引。有关更多信息,请参见您的文档(特别是关于同时查询多个二级索引的部分)。这可以通过(下文进一步讨论)来缓解

高度唯一的分区密钥的优点是,数据将更多地分布在集群中。这里的缺点是,当您使用
WHERE store_id='foo'
执行请求时,需要查询集群中的所有节点,因为分区键没有限制

选项2您必须小心使用。如果您的分区密钥只是store_id,那么每个订单都将放在这个分区中。对于每个订单,将有n列添加到代表订单上每个属性的存储的单行中。关于数据位置,给定存储的所有订单将放在同一个Cassandra节点上

在这两种情况下,为什么不按状态查找订单表?这将消除您对该字段的二级索引的需要。特别是考虑到基数相对较小

CREATE TABLE orders_by_store_id_status (
  store_id VARCHAR,
  status   VARCHAR,
  order_id VARCHAR,
  ... <additional order fields needed to satisfy your query> ...
  PRIMARY KEY ((store_id, status), order_id)
);
按存储\u id\u状态创建表订单(
store_id VARCHAR,
状态VARCHAR,
order_id VARCHAR,
...  ...
主键((存储id、状态)、订单id)
);
这将允许您查询具有给定门店id和状态的所有订单

选择*FROM orders\u by\u store\u id\u status,其中store\u id='foo'和status='open'

读取速度很快,因为分区键限制了我们对其执行查询的节点数