卡桑德拉 - 没有回归

时间:2015-03-23 20:47:05

标签: select indexing cassandra cql

这是我的表:

CREATE TABLE mytable
(
    id uuid,
    day     text,
    mytime      timestamp, 
    value       text,
    status      int,

PRIMARY KEY ((id, day), mytime )
)
WITH CLUSTERING ORDER BY (mytime desc)
;

这是索引:

CREATE INDEX IF NOT EXISTS idx_status ON mytable (status);

当我运行这个select语句时,我得到了预期的结果:

select * from mytable 
where id = 38403e1e-44b0-11e4-bd3d-005056a93afd 
AND day = '2014-10-29'
;

此查询会返回62行。

如果我添加到此查询以包含索引列:

select * from mytable 
where id = 38403e1e-44b0-11e4-bd3d-005056a93afd 
AND day = '2014-10-29'
AND status = 5
;

返回零行。 (有几个状态= 5的记录)

如果我查询表格...只查找特定的索引值:

select * from mytable 
where status = 5
;

也会返回零行。

我不知所措。我不明白究竟发生了什么。

我在3节点集群上,复制级别为3. Cassandra 2.1.3

这可能是一个配置问题......在cassandra.yaml?

或者......我的select语句有问题吗?

感谢您的帮助,谢谢。

更新:

我在system.log文件中看到这个,想法? ...

ERROR [CompactionExecutor:1266] 2015-03-24 15:20:26,596 CassandraDaemon.java:167 - Exception in thread Thread[CompactionExecutor:1266,1,main]
java.lang.AssertionError: /cdata/cassandra/data/my_table-c5f756b5318532afb494483fa1828675/my_table.idx_status-ka-32-Data.db
    at org.apache.cassandra.io.sstable.SSTableReader.getApproximateKeyCount(SSTableReader.java:235) ~[apache-cassandra-2.1.3.jar:2.1.3]
    at org.apache.cassandra.db.compaction.CompactionTask.runMayThrow(CompactionTask.java:153) ~[apache-cassandra-2.1.3.jar:2.1.3]
    at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) ~[apache-cassandra-2.1.3.jar:2.1.3]
    at org.apache.cassandra.db.compaction.CompactionTask.executeInternal(CompactionTask.java:76) ~[apache-cassandra-2.1.3.jar:2.1.3]
    at org.apache.cassandra.db.compaction.AbstractCompactionTask.execute(AbstractCompactionTask.java:59) ~[apache-cassandra-2.1.3.jar:2.1.3]
    at org.apache.cassandra.db.compaction.CompactionManager$BackgroundCompactionTask.run(CompactionManager.java:240) ~[apache-cassandra-2.1.3.jar:2.1.3]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[na:1.7.0_51]
    at java.util.concurrent.FutureTask.run(Unknown Source) ~[na:1.7.0_51]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.7.0_51]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.7.0_51]
    at java.lang.Thread.run(Unknown Source) [na:1.7.0_51]

1 个答案:

答案 0 :(得分:1)

我执行了上面的步骤,并且能够按status=5查询行。我可以建议的一件事是尝试重建索引。从命令提示符处尝试:

nodetool rebuild_index mykeyspace mytable idx_status

否则,IMO解决此问题的最佳方法是使用辅助索引。如果您知道自己需要status支持查询(特别是大型数据集),那么我会认真考虑为它构建一个特定的附加“查询表”。

CREATE TABLE mytablebystatus (id uuid, day text, mytime timestamp, value text, status int, 
PRIMARY KEY ((status),day,mytime,id));

这仅支持statusstatusdaymytime排序的查询。总之,我将尝试一些不同的PRIMARY KEY定义,并查看哪种更适合您的查询模式。这样,您就可以避免一起使用性能不佳的二级索引。