首页 > 解决方案 > 在 cassandra cql 中查询

问题描述

我是卡桑德拉的新手。假设我有一个名为 customer 的表,其中字段 id 作为主键、年龄、名字和姓氏。也采取它,因为该表中有很多数据。如何在该表中查询以获取我的情景,例如“搜索查询。即在情景下获取的选择语句。”

  1. 具有 firstname="something" 和 last name="something" 的数据,即同时满足两者的查询
  2. 如果 firstname=null 和 lastname='我们给出的东西'
  3. if lasttname=null and firstname'我们给的东西'

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

有没有什么办法,......

标签: cassandra-3.0cql3cqlsh

解决方案


您无法通过一次查询获得结果。它与 MySQL 等 RDBMS 有很大不同。有一些主要规则。

  1. 第一条基本规则是,如果主键中未提及某个字段,则不能使用该字段进行查询。为了能够使用非主字段进行查询,您必须提及ALLOW FILTERING,这是不推荐的,并且首先违背了使用 C* 进行更快读取的目的。您可以在非主列上使用二级索引,但有一些权衡(您必须知道在哪里使用它)。

  2. 第二条规则如果有多个主键,则必须按顺序在WHERE子句中提及字段。您不能在不提及分区键的情况下通过集群键进行查询,或者在WHERE子句中不提及分区和第一个集群键的情况下无法通过第二个集群键进行查询,依此类推。(我假设您已经学习了基本知识并且知道术语分区集群键)。

  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)
);

在这里,您可以通过firstnamefirstnameid进行查询。

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

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

从 id = 的用户中选择 *?允许过滤;
create table users(
    id text,
    firstname text,
    lastename text,
    primary key(firstname, lastename, id)
);

在这里您可以通过firstnamelastnameid进行查询。

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%关键字)在这里不起作用。了解分布式特性及其支持上述数据模型的内部架构非常重要。


推荐阅读