假设这个表:
create table s4 (a timeuuid primary key, b timeuuid, stuff text);
create index s4_index1 on s4 (b);
Run Code Online (Sandbox Code Playgroud)
这有效:
select * from s4 where b = 259300f1-01bb-11e3-89a8-896ab45a266f;
Run Code Online (Sandbox Code Playgroud)
但这失败了.为什么?我该如何解决它?
update s4 set stuff='f' where b=259300f1-01bb-11e3-89a8-896ab45a266f;
error->> Bad Request: Non PRIMARY KEY b found in where clause
Run Code Online (Sandbox Code Playgroud)
在不指定主键的情况下进行更新意味着Cassandra必须首先进行分布式搜索以获取所有记录.然后在内部发布所有这些记录的更新.虽然它可以实现,但它与Cassandra中的当前写路径非常不同.
当前写入路径查看插入/更新根据密钥确定应将其发送到哪个节点,然后将请求发送到要写入磁盘的那些节点.
update X where Y
Y是次要索引的写路径会有很大不同.它需要将更新请求发送到每个节点,并等待搜索/更新过程完成.它需要比正常写入更长的时间,并且Cassandra擅长快速写入.
话虽这么说,Cassandra项目始终对新功能的贡献和讨论持开放态度. http://wiki.apache.org/cassandra/HowToContribute
对于"我如何解决它".唯一的方法是自己执行select语句,然后自己更新所有行.或者重新设计数据模型,以便您要执行的更新基于主键.
归档时间: |
|
查看次数: |
4451 次 |
最近记录: |