AKI*_*WEB 16 cql cassandra cql3
我在CQL下面的表格 -
create table test (
employee_id text,
employee_name text,
value text,
last_modified_date timeuuid,
primary key (employee_id)
);
Run Code Online (Sandbox Code Playgroud)
我在上表中插入了几条记录,我将在实际用例场景中插入这些记录 -
insert into test (employee_id, employee_name, value, last_modified_date) values ('1', 'e27', 'some_value', now());
insert into test (employee_id, employee_name, value, last_modified_date) values ('2', 'e27', 'some_new_value', now());
insert into test (employee_id, employee_name, value, last_modified_date) values ('3', 'e27', 'some_again_value', now());
insert into test (employee_id, employee_name, value, last_modified_date) values ('4', 'e28', 'some_values', now());
insert into test (employee_id, employee_name, value, last_modified_date) values ('5', 'e28', 'some_new_values', now());
Run Code Online (Sandbox Code Playgroud)
现在我正在进行选择查询 - 给我employee_name的所有employee_id e27.
select employee_id from test where employee_name = 'e27';
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误 -
Bad Request: No indexed columns present in by-columns clause with Equal operator
Perhaps you meant to use CQL 2? Try using the -2 option when starting cqlsh.
Run Code Online (Sandbox Code Playgroud)
我在这里做错了吗?
我的用例一般 -
我正在运行Cassandra 1.2.11
Ale*_*scu 24
一般规则很简单:"您只能通过属于密钥的列进行查询".作为解释,所有其他查询都需要对表进行完整扫描,这可能意味着需要进行大量数据筛选.
有些东西可以修改这个规则:
PRIMARY KEY (col1, col2);这将允许像col1 = value1和这样的查询col1 = value1 and col2 COND)ALLOW FILTERING在查询中使用.这将导致警告,因为Cassandra将不得不筛选大量数据,并且不会有性能保证.有关更多详细信息,请参阅CQL和此SO线程中的ALLOW FILTERING的详细信息hug*_*ghj 16
Cassandra稍微习惯了:)我们中的一些人已经被RDBMS为你做的一些额外的东西所破坏,你没有从noSql免费获得.
如果您回想一下常规的RDBMS表,如果您对没有索引的列进行SELECT,则DB必须执行全表扫描才能找到您寻找的所有匹配项.这是卡桑德拉的禁忌,如果你试图这样做,它会抱怨.想象一下,如果您在此查询中找到10 ^ 32个匹配项?这不是一个合理的问题.
在您的表中,您已编码*PRIMARY KEY(employee_id);*这是行的主要和唯一标识键. 您现在可以从TEST中选择SELECT*,其中employee_id ='123'; 这是完全合理的,Cassandra很乐意回归结果.
但是,你的SELECT来自TEST WHERE employee_name ='e27'; 告诉Cassandra去阅读每条记录,直到它找到'e27'的匹配.没有索引依赖,它礼貌地要求你"忘记它".
如果要对列进行过滤,请确保在该列上有索引,以便Cassandra可以执行所需的过滤.