Cys*_*Cys 2 cassandra cassandra-cli datastax-java-driver
我有一张如下表:
CREATE TABLE tab(
categoryid text,
id text,
name text,
author text,
desc text,
PRIMARY KEY (categoryid , id)
) WITH CLUSTERING ORDER BY (id ASC);
CREATE INDEX ON tab (name);
CREATE INDEX ON tab (author);
Run Code Online (Sandbox Code Playgroud)
当我执行以下查询时:
select * from tab ALLOW FILTERING; ---1
select * from tab where id = 'id01' ALLOW FILTERING; ---2
select * from tab where categoryid = 'cid01' ALLOW FILTERING; ---3
Run Code Online (Sandbox Code Playgroud)
三个查询的后端发生了什么?
是否会完全忽略id和categoryid上的关键索引.
感谢回复.谢谢
通过指定ALLOW FILTERING您基本上告诉Cassandra您可以从表中检索所有行,逐个检查每个行,并仅返回与您的WHERE子句匹配的行.根据您的WHERE条款,它可能需要也可能不需要这样做.对于大型表或必须查询多个节点以检索所有数据的表,这可能是一个非常慢的操作.
select * from tab ALLOW FILTERING;
Run Code Online (Sandbox Code Playgroud)
对于此查询,您没有WHERE指定子句,因此它将返回tabs表中的所有行. ALLOW FILTERING不应该以任何明显的方式改变这一方面的表现.
select * from tab where id = 'id01' ALLOW FILTERING;
Run Code Online (Sandbox Code Playgroud)
在这个查询中,Cassandra将从tab表中检索所有行,并返回其中的行id='id01'.事实上,这id是一个集群密钥真的不会在这里产生太大的影响.这是因为分区键对于数据查找很重要,并且群集键通常用于强制行唯一性和排序.顺便说一句,由于您没有通过分区键(categoryid)查询它甚至无法强制执行聚类顺序id,因此您的结果集将不会被排序id.
select * from tab where categoryid = 'cid01' ALLOW FILTERING;
Run Code Online (Sandbox Code Playgroud)
像这样的查询使Cassandra高兴!是的,categoryid您的分区键的事实将得到尊重,您的结果集将包含所有CQL行categoryid='cid01'.作为额外的奖励,在这种情况下,您的集群订单将被强制执行.
DataStax的开发者博客有一篇关于这个主题的文章,可能对你有一些帮助:允许过滤解释.
在我看来,我会避免需要允许过滤的查询.我肯定不会在生产或OLTP环境中运行一个.
| 归档时间: |
|
| 查看次数: |
3675 次 |
| 最近记录: |