Cassandra 在空 table 中执行缓慢的查询

Cassandra slow query execution in an empty table

我正在使用 apache-Cassandra-2.2.4,我遇到了这个问题:

当我执行 select * from TRACKING 时; 尽管 table 是空的 (0 行).

,但需要超过 70 秒才能得到结果

作为第一个解决方案,我执行了截断跟踪并解决了问题(return 立即得到结果)。

你能帮我知道根本原因吗?我无法在我的应用程序中截断 table。

可能的原因是您删除了一堆数据,并且您看到了在完整 table 扫描中读取许多墓碑的影响。您可以通过对查询启用跟踪来确认。截断将删除逻辑删除数据。

本文解释了墓碑陷阱和根本原因: http://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets

没有分区键的 SELECT * FROM table 查询必须遍历整个环,直到达到查询的限制。对于令牌环中的每个范围,它本质上都是协调器将一个接一个地进行的子查询。特别是如果你使用 vnodes 它可以是很多这样的 "sub queries" 因为在耗尽环之前它会有更多的范围要覆盖(你将用 0 行来完成)。

此外,由于您实际上是在对整个集群执行大量分散收集请求,因此任何节点遇到 GC 或网络缓慢都会对查询产生相当大的影响。由于请求可能是顺序的(存在一些基于分区计数的并行性),个别减速确实会伤害它。