这不是你可以用 cassandra 做的事情,但你可以遵循一些模式来实现这一点。
这不起作用的主要原因是,由于“名称”不是分区键,因此需要进行完整的数据扫描才能找到名称为“abs”的行。
您可以通过执行以下操作进行两个查询:
select * from table where id=123;
select * from table where name='abs' ALLOW FILTERING;
但我不建议在您的主应用程序路径中使用 ALLOW FILTERING。您也可以添加一个索引,但我也不建议这样做,因为假设 name 是唯一的,那么 name 将具有高基数。 cassandra 3.0 中的全球索引支持可能会有所帮助 (CASSANDRA-6477)。
我认为更好的方法是考虑调整或添加到您的数据模型。
例如,既然您要对“名称”强制执行唯一性,为什么不将其作为主键呢? id 对你有什么意义吗?我认为在两个单独的列上强制唯一性是一个不常见的要求。通常,主键/唯一性约束由单个列或一起使用的列组合组成,而不是排他性的。
您可以考虑的另一件事是使用以下架构声明第二个表“table_by_name”作为索引映射名称到 id:
create table table_by_name (
id int,
name text,
primary key (name, id)
);
然后,您需要在两个表中维护对数据的更改。但是,您现在可以进行两个单独的查询来确定记录是否已经存在:
select * from table where id=123;
select * from table_by_name where name='abs';
这将是一个相对便宜的做法,并且性能会很好。唯一的代价是您现在正在复制数据,但这实际上是索引在关系数据库中所做的事情,将索引列和包含的列存储在单独的位置。