【发布时间】:2017-07-17 12:27:41
【问题描述】:
我的基于 Cassandra 的应用程序需要读取自上次读取后更改的行。
为此,我们计划创建一个包含两列的表changed_rows -
- ID - 更改行的 ID 和
- Updated_Time - 更改时的时间戳。
读取这样一个表的最佳方法是什么,以便它读取按时间排序的一小组行。 示例:如果表是:
ID Updated_Time
foo 1000
bar 1200
abc 2000
pqr 2500
zyx 2900
...
xyz 901000
...
我已经展示了 ID 是简单的 3 个字母键,实际上它们是 UUID。
此外,为简单起见,上面显示的时间显示为整数,但它是实际的 Cassandra 时间戳(或 Java 日期)。 Updated_Time 列是单调递增的。
如果我查询这些数据:
SELECT * FROM changed_rows WHERE Updated_Time < toTimestamp(now())
我收到以下错误:
Cannot execute this query as it might involve data filtering and
thus may have unpredictable performance... Use Allow Filtering
但我认为Allow Filtering 在这种情况下会破坏性能。
Cassandra 索引页面警告要避免为高基数列建立索引,并且上面的 Updated_Time 肯定看起来像高基数。
我事先不知道 ID 列,因为查询的目的是了解在给定时间间隔之间更新的 ID。
那么在这种情况下查询 Cassandra 的最佳方法是什么?
我可以以某种方式更改我的表以更有效地运行时间块查询吗?
注意:这听起来应该有点类似于Cassandra-CDC feature,但我们不能使用相同的,因为我们的解决方案应该适用于所有 Cassandra 版本
【问题讨论】:
标签: optimization cassandra datastax cql cqlsh