我的 Cassandra 数据库中有一张桌子。
CREATE TABLE table (
pk uuid,
status int,
location text,
type text,
id text,
updatedtimestamp timestamp,
PRIMARY KEY (pk)
);
CREATE INDEX tablelocation ON table (location);
CREATE INDEX tabletype ON table (type);
CREATE INDEX tableid ON table (id);
CREATE INDEX tableupdatedtimestamp ON table (updatedtimestamp);
我运行的查询是:
Select * from table
where location='A1'
and type='T1'
and status=001
and id='NA'
allow filtering;
Cassandra 需要超过 5 秒的时间来为该查询返回 4000 条记录。我已经在所有这些列上都有二级索引。根据 DBA,问题是id='NA'
有条件的。此条件为真的行太多。
但是,这种情况是由于业务用例而存在的,如果没有其他机制来过滤该值,就无法删除该条件。
我正在考虑创建一个包含所有 4 列的新索引。但是,我担心它会妨碍写入性能。状态栏会非常频繁地更新。
我们可以做些什么来调整这个查询的性能吗?
使用 Cassandra 进行索引永远不会高效,因为它不是设计的。Cassandra 的 4000 行并不是什么大问题。但是查询集群中所有节点的 4000 行,现在您已将网络时间添加到等式中。
如果您希望执行此操作,您需要做的是构建一个表来支持此查询。具体来说,这意味着设计一个主键结构,以便查询可以由单个节点提供服务。
根据位置和类型的基数,您可以尝试以下操作:
location
这将按和对您的数据进行分区type
,确保该列组合上的数据将存储在一起。接下来,这会将您的数据(在每个分区内id
)聚类,并pk
在末尾添加 以确保唯一性。只要与and一起使用,索引就status
可以了。location
type
专业提示:
ALLOW FILTERING
指令。根据 Casandra CQL 文档
ALLOW FILTER
:参考: 数据操作(Cassandra 文档)
所以
ALLOW FILTERING
从你的语句中删除指令SELECT...
,看看性能是否有所提高。@Aaron 在他的回答中也指出了这一点:
我刚刚从官方文档中添加了详细信息。