【发布时间】:2019-08-29 01:26:41
【问题描述】:
我有一个高写入表,我要从 Oracle 迁移到 Cassandra。在 Oracle 中,PK 是一个(int:clientId,id:UUID)。大约有 100 亿行。我马上就遇到了这个荒谬的警告:
https://docs.datastax.com/en/cql/3.3/cql/cql_using/useWhenIndex.html: “如果您在具有许多不同值的高基数列上创建索引,则字段之间的查询将引发许多搜索,但结果却很少。在包含十亿首歌曲的表中,按作者查找歌曲(一个值通常对于每首歌曲都是唯一的)而不是由他们的艺术家,这可能是非常低效的。将表格手动维护为一种索引形式而不是使用 Cassandra 内置索引可能会更有效。”
这似乎不仅破坏了 PK 的有效查找,它还没有定义“字段之间查询”的含义以及内置索引、二级索引和主键+集群之间的区别创建表命令中的子短语。垃圾描述。现在是 2019 年。现在不应该解决这个问题吗?
AFAIK 无论如何都是误导:
CREATE TABLE dev.record (
clientid int,
id uuid,
version int,
payload text,
PRIMARY KEY (clientid, id, version)
) WITH CLUSTERING ORDER BY (id ASC, version DESC)
insert into record (id,version,clientid,payload) values
(d5ca94dd-1001-4c51-9854-554256a5b9f9,3,1001,'');
insert into record (id,version,clientid,payload) values
(d5ca94dd-1002-4c51-9854-554256a5b9e5,0,1002,'');
clientid 上的令牌确实表明它们按预期位于不同的分区中。
转向重点。如果在给定 clientId 的情况下寻找单行,并且 UUID ---AND--- Cassandra 允许您跳过指定 clientId 以便它不知道要搜索哪个节点,那么请确保查找可能很慢.但它没有:
select * from record where id=
d5ca94dd-1002-4c51-9854-554256a5b9e5;
InvalidRequest: ... despite the performance unpredictability,
use ALLOW FILTERING"
以及排除 clientid 的其他变体。那么我们不应该得出结论,Cassandra 可以很好地处理返回“很少结果”的高基数表搜索吗?
【问题讨论】:
-
与文档似乎暗示的相反——或者不是因为它写得如此糟糕——这个选择非常有效:select * from dev.record其中 clientId=1001 和 id = 5bcd...ff 和 version = 0 就可以了。如果您尝试不带 clientId 的选择,则会警告您需要过滤子句,结果可能会很慢。因此,无论如何,您甚至都不会意外遇到错误的查询
标签: cassandra