如何使用Cassandra CQL获取此表的最后50行?

如何使用Cassandra CQL获取此表的最后50行?,cassandra,cql,Cassandra,Cql,这是我用来创建表的查询: CREATE TABLE test.comments (msguuid timeuuid, page text, userid text, username text, msg text, timestamp int, PRIMARY KEY (msguuid)); 我想让最后50行按时间戳降序排序 如果我尝试以下操作:SELECT*FROM test.comments,其中page='test'和timestamp

这是我用来创建表的查询:

CREATE TABLE test.comments (msguuid timeuuid, page text, userid text, username text, msg text, timestamp int, PRIMARY KEY (msguuid));
我想让最后50行按时间戳降序排序

如果我尝试以下操作:
SELECT*FROM test.comments,其中page='test'和timestamp<1496468332
,我会得到以下错误:

Error from server: code=2200 [Invalid query] message="Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING"
我不希望使用允许过滤,我希望查询尽可能快

我在这里查看了另一个stackoverflow问题,并尝试了解决方案:

CREATE TABLE test.comments (msguuid timeuuid, page text, userid text, username text, msg text, timestamp int, PRIMARY KEY (msguuid)) WITH CLUSTERING ORDER BY (msguuid DESC);
但是我得到了这个错误:
InvalidRequest:error from server:code=2200[Invalid query]message=“只能在clustering ORDER指令中定义集群键列”

我是卡桑德拉的新手,所以如果这有一个明显的答案,请原谅我。我就是不能让它工作


如果有人能帮助我,我将不胜感激。

不要使用索引创建一个

创建一个物化视图,页面作为分区键,MSGUID作为集群键,顺序为desc

CREATE MATERIALIZED VIEW test.comments_by_page AS
    SELECT *
    FROM test.comments
    WHERE page IS NOT NULL AND msguuid IS NOT NULL
    PRIMARY KEY (page, msguuid)
    WITH CLUSTERING ORDER BY (msguuid DESC);
尽管您使用
msguuid
作为当前时间戳的timeuuid,但您的数据将按时间描述排序

要获取页面的最后50行,请使用以下查询:

SELECT * FROM comments_by_page WHERE page = 'test' LIMIT 50;

查看此链接了解物化视图相对于索引的性能以及何时不使用:

而不是使用索引创建一个

创建一个物化视图,页面作为分区键,MSGUID作为集群键,顺序为desc

CREATE MATERIALIZED VIEW test.comments_by_page AS
    SELECT *
    FROM test.comments
    WHERE page IS NOT NULL AND msguuid IS NOT NULL
    PRIMARY KEY (page, msguuid)
    WITH CLUSTERING ORDER BY (msguuid DESC);
尽管您使用
msguuid
作为当前时间戳的timeuuid,但您的数据将按时间描述排序

要获取页面的最后50行,请使用以下查询:

SELECT * FROM comments_by_page WHERE page = 'test' LIMIT 50;

查看此链接以了解物化视图相对于索引的性能以及何时不使用:

在cassandra world中,尝试根据表需要满足的查询对表进行建模。如果查询总是通过where子句“page”进行,并且MSGUID仅用于唯一性,请将表重新设计为如下所示

CREATE TABLE test.comments (msguuid timeuuid, page text, userid text, username text, msg text, timestamp int, PRIMARY KEY (page, msguuid), WITH CLUSTERING ORDER BY (msguuid DESC));

现在,表自然是按MSGUID排序的,不需要有额外的物化视图开销。

在cassandra world中,尝试根据表需要满足的查询对表进行建模。如果查询总是通过where子句“page”进行,并且MSGUID仅用于唯一性,请将表重新设计为如下所示

CREATE TABLE test.comments (msguuid timeuuid, page text, userid text, username text, msg text, timestamp int, PRIMARY KEY (page, msguuid), WITH CLUSTERING ORDER BY (msguuid DESC));


现在,表自然是按MSGUID排序的,没有任何要求需要有物化视图的额外开销。

页面是索引字段吗?是的,页面是索引的您使用的是哪个cassandra版本?[cqlsh 5.0.1 | cassandra 3.10 | CQL spec 3.4.4 |本机协议v4]如何使用当前时间生成MSGUID?页面是否已索引字段?是的,页面是否已索引您使用的是哪个cassandra版本?[cqlsh 5.0.1 | cassandra 3.10 | CQL spec 3.4.4 |本机协议v4]如何使用当前时间生成MSGUID?谢谢,我很高兴有一种不用额外开销的方法。我将你的答案标记为答案。@dilsingi我的解决方案不会生成墓碑。仅当MV的主键
页面
msgUID
在基表上更新时,MV才会生成墓碑。对于他的情况,没有机会更新
page
的值,因为它是他的主键,
msguuid
也不会更新,因为它是当前的时间戳timeuuid。在建议Anywhere@AshrafulIslam之前了解更多信息根据最初的表定义,它从来没有“页面”作为主键。请查收。因此,它可能已经被更新,MV将导致墓碑。在这种情况下,你的(@dilsingi)设计如何?如果页面已更新,则需要删除并重新插入该页面的所有MSGUID和相关数据again@AshrafulIslam的确,对于Cassandra中的任何表,主键都不能修改。但是为什么要在原始表能够满足用例的情况下创建MV呢。因此,围绕查询对表进行建模,而不是相反。谢谢,我很高兴有一种方法可以做到这一点,而不需要额外的开销。我将你的答案标记为答案。@dilsingi我的解决方案不会生成墓碑。仅当MV的主键
页面
msgUID
在基表上更新时,MV才会生成墓碑。对于他的情况,没有机会更新
page
的值,因为它是他的主键,
msguuid
也不会更新,因为它是当前的时间戳timeuuid。在建议Anywhere@AshrafulIslam之前了解更多信息根据最初的表定义,它从来没有“页面”作为主键。请查收。因此,它可能已经被更新,MV将导致墓碑。在这种情况下,你的(@dilsingi)设计如何?如果页面已更新,则需要删除并重新插入该页面的所有MSGUID和相关数据again@AshrafulIslam的确,对于Cassandra中的任何表,主键都不能修改。但是为什么要在原始表能够满足用例的情况下创建MV呢。因此,围绕查询对表进行建模,而不是相反。