在使用datastax Querybuilder删除带有某个projectId (主键)的表的所有行之后,我们得到一个带有辅助索引的AND结合的查询的“隐藏结果”。
示例:
主键:
二级指数:
使用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服务和服务器 - >什么都没有改变。
继续:
表格属性(描述表格):
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);
答案 0 :(得分:2)
我猜你appversion
上的二级索引不同步。这不应该经常发生,但如果再次发生,请尝试使用NodeTool rebuild_index重建索引。
nodetool rebuild_index a test
那应该重建a.test表上的所有二级索引。如果您在appversion
上有索引的名称,则可以将其添加为最终参数,以便仅重建该特定索引。
另外,只是想知道,但您是否尝试将索引列构建为主键上的群集列?
PRIMARY KEY((projectid),appversion,viewstate)
此主键定义将允许您的两个查询(如上所述)工作。它也应该比使用二级索引更快,你不必担心它再次失去同步。