这是我的表:
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]
答案 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));
这仅支持status
,status
和day
按mytime
排序的查询。总之,我将尝试一些不同的PRIMARY KEY定义,并查看哪种更适合您的查询模式。这样,您就可以避免一起使用性能不佳的二级索引。