墓碑影响Cassandra读数

时间:2018-06-11 00:44:06

标签: cassandra-3.0 tombstone

我对墓碑影响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子句中没有指定列的情况下才会拾取逻辑删除?

1 个答案:

答案 0 :(得分:0)

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

  • 已读取指定的实时列限制
  • 已读取完成列之外的列(如果已指定)
  • 已读取该行中的所有列

[这里] [https://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets]

描述了一个很好的例子

不是基于与列(索引)值完全相等而执行搜索的读取的情况。在这种情况下,Cassandra只使用Bloom过滤器和索引来检查Memtable / SSTables - 对读取速度没有影响。