在Cassandra CQL中查询

时间:2018-12-18 11:17:06

标签: cassandra-3.0 cql3 cqlsh

我是卡桑德拉的新手。假设我有一个名为customer的表,其字段ID为主键,年龄,名字和姓氏。也要考虑一下,因为该表中有太多数据。如何在该表中查询以获取我的senario,例如“搜索查询。这是一个获取以下senario的选择语句。”

  1. 同时具有名字“ something”和姓氏“ something”的数据,这是满足两个条件的查询
  2. 如果firstname = null和lastname ='我们提供的内容'
  3. 如果lasttname = null和名字“我们给的东西”

我们如何使用满足三个条件的单个cql查询语句进行查询。

有没有办法.....

1 个答案:

答案 0 :(得分:0)

您无法通过一个查询获得结果。它与RDBMS(例如MySQL)有很大不同。有一些主要规则。

  1. 第一个基本规则是,如果未提及该字段,则无法使用该字段进行查询 在主键中。为了能够使用非主要字段进行查询,您必须提及允许过滤,这是不建议使用的,它违背了使用C *进行快速读取的目的。您可以在非主列上使用二级索引,但需要权衡取舍(您必须知道在哪里使用它)。

  2. 第二条规则,如果有多个主键,您必须提及 WHERE 子句中的字段。您无法通过集群查询 键没有提及分区键或无法通过第二个查询 不提及分区的集群密钥和第一集群密钥 在 WHERE 子句中,依此类推。 (我假设您已经学习了基础知识,并且知道术语 partition clustering 键)。

  3. 主键不能为 NULL

下面我举一个例子。

create table users(
    id text,
    firstname text,
    lastename text,
    primary key(id)
);

如果您的架构与上面类似,则只能通过'id'查询。

select * from users where id = ?;

您不能通过名字或姓氏(没有提到它们作为关键字)进行查询。

create table users(
    id text,
    firstname text,
    lastename text,
    primary key(firstname, id)
);

在这里您可以按名字名字 id 进行查询。

select * from users where firstname = ? ;
select * from users where firstname = ? and id = ?;

第一个查询可满足您的第二个搜索名字的要求。 (与此相同,您需要另一个表,其中姓氏作为您的第三个要求的分区键。) 您不能仅使用 id 转义名字来查询。 通过使用允许过滤,您可以通过 id 进行查询。

select * from users where id = ? ALLOW FILTERING;
create table users(
    id text,
    firstname text,
    lastename text,
    primary key(firstname, lastename, id)
);

在这里您可以按名字 id 进行查询。

select * from users where firstname = ?;
select * from users where firstname = ? and lastname = ?;
select * from users where firstname = ? and lastname = ? and id = ?;

第二个查询满足您的第一个要求。

摘要::您至少需要3个表,并将所有数据非规范化/复制到3个表中才能提供查询。您只能使用一个表,并在其他表适合的地方建立索引,但是性能会下降。物化视图(每个查询的表)比二级索引要快得多。最重要的是,在这里您只能搜索完全匹配。部分匹配(MySQL中的 like 关键字)在这里不起作用。了解分布式特性及其内部架构(支持上述数据模型)很重要。