0

我对墓碑影响 Cassandra 读取有点困惑。这是第一种情况:

有一个 Cassandra 表:

CREATE TABLE IF NOT EXISTS URL_MAPPINGS (
  pagehash          text,
  url               text,
  address           text,
  PRIMARY KEY ((pagehash), url)
)

我在此表中插入两个条目:

INSERT INTO url_mappings (pagehash1, url1, address1)
INSERT INTO url_mappings (pagehash2, url2, address1)

然后我在这张表上使用 nodetool flush 并清楚地看到保存的两个值(使用 sstabledump)。

然后我更新第一条记录中的地址值:

UPDATE url_mappings SET address='updated' WHERE pagehash='pagehash2' AND url='url2';

我再次在此表上使用 nodetool flush 并看到为第一个条目地址列添加了一个墓碑。

好的,现在我通过以下方式读取这些值

SELECT * FROM url_mappings;

在 sqlsh 中设置了 TRACING ON。我看到返回了 2 个最新条目,并带有以下调试输出:

读取 2 个活动行和 0 个墓碑单元

AFAIK 升级不构成墓碑,但是我可以看到读取了多个 SSTable 以返回结果。

一旦我删除了第一条记录 - 我可以在再次读取所有表值时在输出中看到以下内容:

读取 1 个活动行和 1 个墓碑单元

这就是我希望看到的。但是,当我对剩余记录执行此查询时:

SELECT pagehash, url, address, ttl(address) FROM url_mappings WHERE pagehash='somethin2';

我看到以下跟踪信息:

读取 1 个活动行和 0 个墓碑单元

问题是为什么只有在 WHERE 子句中没有指定列的情况下才会选择墓碑?

4

1 回答 1

0

看起来墓碑仅影响切片查询的读取,因此 Cassandra 事先不知道哪些 Memtable/SSTable(s) 包含请求的条目,并且需要遍历所有这些条目,直到满足以下条件之一:

  • 已读取指定的活动列限制
  • 已读取完成列之外的列(如果指定)
  • 该行中的所有列都已被读取

[这里][ https://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets]描述了一个很好的例子。

对于基于与列(索引)值完全相等执行搜索的读取,情况并非如此。在这种情况下,Cassandra 只需使用 Bloom Filters 和索引来检查 Memtable/SSTables - 对读取速度没有影响。

于 2018-06-18T04:02:57.623 回答