Cassandra 2.0.6:将 AND 添加到查询时结果数量更多

Cassandra 2.0.6: Higher number of results when adding AND to query

在我们删除了 table 中具有特定 projectId[=66= 的所有行之后,我们得到 "hidden results" 一个带有二级索引的 AND 连接的查询 ](主键)使用datastax Querybuilder。

示例:

主键:

  • 项目编号

二级索引:

  • 应用程序版本
  • 视图状态

带有 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 墓碑有关。所以我们执行了 nodetool repaircompact 并重新启动了 cassandra 服务和服务器 -> 没有任何变化。

运行 于:

  • 卡桑德拉 2.0.6
  • Windows 服务器 2012 R2 标准版
  • 64 位
  • 通过 java 删除,使用 datastax QueryBuilder (cassandra-driver-core-2.0.1)

Table 属性(描述 tables):

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'};

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

问题

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

提前致谢...

添加了table创建过程

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);

我猜测您在 appversion 上的二级索引不同步。这种情况不应该经常发生,但如果再次发生,请尝试使用 NodeTool rebuild_index.

重建索引
nodetool rebuild_index a test

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

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

PRIMARY KEY((projectid),appversion,viewstate)

这个主键定义将允许您的两个查询(上面提到的)工作。它还应该比使用二级索引更快,而且您不必担心它会再次不同步。