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 repair 和 compact 并重新启动了 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)
这个主键定义将允许您的两个查询(上面提到的)工作。它还应该比使用二级索引更快,而且您不必担心它会再次不同步。
在我们删除了 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 repair 和 compact 并重新启动了 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)
这个主键定义将允许您的两个查询(上面提到的)工作。它还应该比使用二级索引更快,而且您不必担心它会再次不同步。