我对墓碑影响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子句中没有指定列的情况下才会拾取逻辑删除?
答案 0 :(得分:0)
看起来墓碑仅影响切片查询的读取,因此Cassandra事先不知道哪些Memtable / SSTable包含所请求的条目,并且需要经历所有这些条目直到其中一个满足以下条件:
[这里] [https://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets]。
描述了一个很好的例子不是基于与列(索引)值完全相等而执行搜索的读取的情况。在这种情况下,Cassandra只使用Bloom过滤器和索引来检查Memtable / SSTables - 对读取速度没有影响。