【问题标题】:Why can cassandra "select" on secondary key, but not update using secondary key? (1.2.8+)为什么 cassandra 可以在辅助键上“选择”,但不能使用辅助键更新? (1.2.8+)
【发布时间】:2013-08-12 07:02:45
【问题描述】:

假设这张表:

create table s4 (a timeuuid primary key, b timeuuid, stuff text);
create index s4_index1 on s4 (b);

这行得通:

select * from s4 where b = 259300f1-01bb-11e3-89a8-896ab45a266f;

但这失败了。为什么?我该如何解决?

update s4 set stuff='f' where b=259300f1-01bb-11e3-89a8-896ab45a266f;
error->> Bad Request: Non PRIMARY KEY b found in where clause

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

    在不指定主键的情况下进行更新意味着 Cassandra 必须首先进行分布式搜索才能获取所有记录。然后在内部发布所有这些记录的更新。虽然可以实现,但它与 Cassandra 内部当前的写入路径有很大不同。

    当前写入路径查看插入/更新,根据密钥确定应该发送到哪些节点,然后将请求发送到这些节点以写入磁盘。

    update X where Y 的写入路径(其中 Y 是二级索引)会大不相同。它需要向每个节点发送更新请求,并等待搜索/更新过程完成。这将比普通写入花费更长的时间,而且 Cassandra 擅长快速写入。

    话虽如此,Cassandra 项目始终对新功能的贡献和讨论持开放态度。 http://wiki.apache.org/cassandra/HowToContribute

    对于“我该如何解决它”。唯一的方法是自己执行 select 语句,然后自己更新所有行。或者重新设计您的数据模型,以便您想要执行的更新基于主键。

    【讨论】:

    • 所以因为它是一个“昂贵”的操作,所以必须在应用程序代码中完成工作的逻辑。似乎是有道理的,但它确实会让你的代码在你需要的时候变得更复杂。
    • 是的,如果你需要这样做,你的代码会更复杂。通常你会尝试为那个用例去规范化一个模式,这样你就可以做你想做的事情,而不需要先“选择”。
    猜你喜欢
    • 2016-04-23
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多