Cassandra - 没有返回行
Cassandra - No Rows Returned
这是我的 Table:
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
;
返回零行。 (有几条status = 5的记录)
如果我查询 table...仅查找特定索引值:
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]
我 运行 你上面的步骤并且能够通过 status=5
查询行就好了。我可以建议的一件事是尝试重建索引。从命令提示符试试这个:
nodetool rebuild_index mykeyspace mytable idx_status
否则,IMO 解决此问题的最佳方法是 不 使用二级索引。如果您知道 status
必须支持查询(尤其是大型数据集),那么我会认真考虑为其构建一个特定的附加 "query table"。
CREATE TABLE mytablebystatus (id uuid, day text, mytime timestamp, value text, status int,
PRIMARY KEY ((status),day,mytime,id));
这将仅支持按 status
或按 mytime
排序的 status
和 day
的查询。总之,我会尝试一些不同的 PRIMARY KEY 定义,看看哪个更适合您的查询模式。这样,您就可以避免同时使用性能不佳的二级索引。
这是我的 Table:
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
;
返回零行。 (有几条status = 5的记录)
如果我查询 table...仅查找特定索引值:
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]
我 运行 你上面的步骤并且能够通过 status=5
查询行就好了。我可以建议的一件事是尝试重建索引。从命令提示符试试这个:
nodetool rebuild_index mykeyspace mytable idx_status
否则,IMO 解决此问题的最佳方法是 不 使用二级索引。如果您知道 status
必须支持查询(尤其是大型数据集),那么我会认真考虑为其构建一个特定的附加 "query table"。
CREATE TABLE mytablebystatus (id uuid, day text, mytime timestamp, value text, status int,
PRIMARY KEY ((status),day,mytime,id));
这将仅支持按 status
或按 mytime
排序的 status
和 day
的查询。总之,我会尝试一些不同的 PRIMARY KEY 定义,看看哪个更适合您的查询模式。这样,您就可以避免同时使用性能不佳的二级索引。