Cassandra 2.0.6:添加AND以查询时的结果数量更多

时间:2015-01-22 16:27:01

标签: database cassandra cql datastax-java-driver

在使用datastax Querybuilder删除带有某个projectId (主键)的表的所有行之后,我们得到一个带有辅助索引的AND结合的查询的“隐藏结果”。

示例:

主键:

  • 专案编号

二级指数:

  • appVersion
  • VIEWSTATE

使用AND的查询:

SELECT * FROM a.test WHERE projectId='test' AND appVersion=1 AND viewState='FeedListActivity';

结果 1

SELECT * FROM a.test WHERE projectId='test' AND appVersion=1;

结果 0 行。

我们认为它可能与Cassandras Tombstones有关。所以我们执行了 nodetool repair compact 并重新启动了cassandra服务和服务器 - >什么都没有改变。

继续:

  • Cassandra 2.0.6
  • Windows Server 2012 R2标准版
  • 64位
  • 使用datastax QueryBuilder( cassandra-driver-core-2.0.1 )通过java删除

表格属性(描述表格):

WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=0 AND
index_interval=128 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};

解决方法: 我们将整个内容复制到一个相同的表中,截断旧的内容并将数据复制回来。现在我们得到两个查询一个结果。

问题

是否有正确的方法我们不需要使用变通方法?我们错过了什么吗?

提前致谢...

添加了表格创建流程

DROP TABLE IF EXISTS a.test;
CREATE TABLE a.test (
  projectid text,  
  appversion int,  
  viewstate text,
  PRIMARY KEY (projectid)
);

CREATE INDEX ON a.test (appversion);
CREATE INDEX ON a.test (viewstate);

1 个答案:

答案 0 :(得分:2)

我猜你appversion上的二级索引不同步。这不应该经常发生,但如果再次发生,请尝试使用NodeTool rebuild_index重建索引。

nodetool rebuild_index a test

那应该重建a.test表上的所有二级索引。如果您在appversion上有索引的名称,则可以将其添加为最终参数,以便仅重建该特定索引。

另外,只是想知道,但您是否尝试将索引列构建为主键上的群集列?

PRIMARY KEY((projectid),appversion,viewstate)

此主键定义将允许您的两个查询(如上所述)工作。它也应该比使用二级索引更快,你不必担心它再次失去同步。