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