Cassandra 查询时的问题汇总

本文深入探讨了Apache Cassandra数据库的查询限制,包括常见的查询报错原因及解决策略,如ALLOW FILTERING错误和视图创建技巧,帮助开发者有效提升查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

Apache Cassandra是一个高度可扩展的高性能分布式数据库,用于处理大量商用服务器上的大量数据,提供高可用性,无单点故障。这是一种NoSQL类型的数据库。

为了保证效率,Cassandra只提供了很简单的查询语法,针对部分相对复杂的语法并不支持,今天对几种比较常见的查询报错进行了总结。

 

创建表结构:

CREATE TABLE IF NOT EXISTS user (

id timeuuid,

name text,

age text,

node text,

PRIMARY KEY (id,name,age)

);

 

常见问题:

1. 正常查询

概述:cql的主键作为条件时,必须按照顺序进行过滤,且第一个主键必须精确查询

如:select * from user where id=5eb908c0-6cd5-11ea-a901-53d24cdbd897 and name='zhangsan'

2. 报错:ALLOW FILTERING

概述:

a. 报这种错时,说明该查询是一种很消耗内存的查询方式;

b. 非主键列作为where后的过滤条件时,会出现这种错误;

如:select * from user where node='test';

c. 过滤条件缺失部分主键,且不按照顺序使用主键时,会出现这种错误;

如:select * from user where name='test';

d. 第一个主键不使用精确查询,会出现这种错误。

如:select * from user where id>5eb908c0-6cd5-11ea-a901-53d24cdbd897 and name='test';

解决:

a. 在查询最后,加上 " ALLOW FILTERING"强制执行(效率低,不推荐)

b. 创建合适的视图

3. 报错:"xx" cannot be restricted as preceding column "yy" is not restricted

概述:在yy列没有定义之前,xx列不能定义

如:select * from user where id=5eb908c0-6cd5-11ea-a901-53d24cdbd897 and age='25'

报错:"age" cannot be restricted as preceding column "name" is not restricted

解决:创建合适的视图

4. 报错:"xx" LIKE '%test%' is not valid.

概述:cassandra不支持like的语法,如果使用like关键字进行模糊查询就会报错

解决:对于字符串(如"test")的查询,一般要替换为">="和"<"的组合来实现,比如where xx >= 'test' and xx < 'tesu'(上限字符计算的算法参考附件资源)

 

视图方式解决部分问题:

针对问题2、问题3这类过滤条件的顺序问题,可以依据查询实际需要,调整联合主键的顺序,创建合适的视图

比如问题3,可以创建视图:

CREATE MATERIALIZED VIEW IF NOT EXISTS user_by_id_and_age AS

SELECT * FROM user

WHERE id IS NOT NULL AND name IS NOT NULL AND age IS NOT NULL

PRIMARY KEY (id, age, name )

WITH CLUSTERING ORDER BY ( id, age, name );

当然,也可以实现问题2中非主键的查询,可以创建视图:

CREATE MATERIALIZED VIEW IF NOT EXISTS user_by_id_and_age AS

SELECT * FROM user

WHERE id IS NOT NULL AND name IS NOT NULL AND age IS NOT NULL AND node IS NOT NULL

PRIMARY KEY (node, id, age, name )

WITH CLUSTERING ORDER BY ( id, age, name );

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值