允许过滤实现@Cassandra
ALLOW FILTERING implementation @Cassandra
我有一个 table 如下所示:
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);
当我执行以下查询时:
select * from tab ALLOW FILTERING; ---1
select * from tab where id = 'id01' ALLOW FILTERING; ---2
select * from tab where categoryid = 'cid01' ALLOW FILTERING; ---3
三个查询的后端发生了什么?
是否会完全忽略id和categoryid上的关键索引
感谢回复。
谢谢
通过指定 ALLOW FILTERING
,你基本上是在告诉 Cassandra 你可以接受它从你的 table 中检索所有行,逐一检查它们,然后 return仅搜索与您的 WHERE
子句匹配的那些。根据您的 WHERE
子句,它可能需要也可能不需要这样做。在大型 table 或必须查询多个节点以检索所有数据的情况下,这可能是一个非常缓慢的操作。
select * from tab ALLOW FILTERING;
对于此查询,您没有指定 WHERE
子句,因此它将 return tabs
table 中的所有行。 ALLOW FILTERING
不应以任何明显的方式改变这台机器的性能。
select * from tab where id = 'id01' ALLOW FILTERING;
在此查询中,Cassandra 将从 tab
table 中检索所有行,并且仅检索 return id='id01'
中的行。 id
是一个集群键这一事实在这里真的不会有太大的不同。这是因为分区键对于数据查找很重要,而集群键通常用于强制行唯一性和排序。顺便说一句,由于您不是按分区键 (categoryid
) 查询,它甚至无法在 id
上执行聚类顺序,因此您的结果集不会按 id
排序。
select * from tab where categoryid = 'cid01' ALLOW FILTERING;
像这样的查询让 Cassandra 很开心!是的,categoryid
是您的分区键这一事实将得到尊重,并且您的结果集将包含所有 categoryid='cid01'
的 CQL 行。作为额外的好处,在这种情况下,您的聚类顺序将被强制执行。
DataStax 的开发者博客有一篇关于此主题的不错的文章,可能对您有进一步的帮助:ALLOW FILTERING Explained。
在我看来,我会避免需要允许过滤的查询。我当然不会 运行 在生产环境或 OLTP 环境中。
我有一个 table 如下所示:
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);
当我执行以下查询时:
select * from tab ALLOW FILTERING; ---1
select * from tab where id = 'id01' ALLOW FILTERING; ---2
select * from tab where categoryid = 'cid01' ALLOW FILTERING; ---3
三个查询的后端发生了什么?
是否会完全忽略id和categoryid上的关键索引
感谢回复。 谢谢
通过指定 ALLOW FILTERING
,你基本上是在告诉 Cassandra 你可以接受它从你的 table 中检索所有行,逐一检查它们,然后 return仅搜索与您的 WHERE
子句匹配的那些。根据您的 WHERE
子句,它可能需要也可能不需要这样做。在大型 table 或必须查询多个节点以检索所有数据的情况下,这可能是一个非常缓慢的操作。
select * from tab ALLOW FILTERING;
对于此查询,您没有指定 WHERE
子句,因此它将 return tabs
table 中的所有行。 ALLOW FILTERING
不应以任何明显的方式改变这台机器的性能。
select * from tab where id = 'id01' ALLOW FILTERING;
在此查询中,Cassandra 将从 tab
table 中检索所有行,并且仅检索 return id='id01'
中的行。 id
是一个集群键这一事实在这里真的不会有太大的不同。这是因为分区键对于数据查找很重要,而集群键通常用于强制行唯一性和排序。顺便说一句,由于您不是按分区键 (categoryid
) 查询,它甚至无法在 id
上执行聚类顺序,因此您的结果集不会按 id
排序。
select * from tab where categoryid = 'cid01' ALLOW FILTERING;
像这样的查询让 Cassandra 很开心!是的,categoryid
是您的分区键这一事实将得到尊重,并且您的结果集将包含所有 categoryid='cid01'
的 CQL 行。作为额外的好处,在这种情况下,您的聚类顺序将被强制执行。
DataStax 的开发者博客有一篇关于此主题的不错的文章,可能对您有进一步的帮助:ALLOW FILTERING Explained。
在我看来,我会避免需要允许过滤的查询。我当然不会 运行 在生产环境或 OLTP 环境中。