我在3个亚马逊m3Large实例上运行Cassandra 2.0.9。
cqlsh> DESCRIBE KEYSPACE test;
CREATE KEYSPACE test WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': '2'
};
表:
cqlsh:test> DESCRIBE TABLE link_list;
CREATE TABLE link_list (
url text,
visited boolean,
PRIMARY KEY ((url))
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.000000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
查询:
SELECT * FROM link_list WHERE visited = False Limit 1;
该表有大约275,000行,并不多。有大约20个客户端尝试运行此查询并将数据插入link_list表。有些时候一切都运行顺利,但大多数时候运行select查询需要几秒钟(一致性为2)。
我在visited
列上有一个索引,我希望这个查询在我的设置上运行得非常快,但实际情况并非如此。能不能让我知道我做错了什么,加快一切的最佳方法是什么。
追踪(超过4k行):http://www.pastebin.ca/2834424
答案 0 :(得分:5)
这样的行:
Read 3 live and 3938 tombstoned cells | 16:06:46,644 | 54.228.94.22 | 138436
提供原因的提示。您显然正在删除大量记录(或使用不恰当的TTL),这会生成墓碑。您的墓碑都必须为此查询读取,因为否则Cassandra不知道删除了什么。由于这个原因,在Cassandra中进行大量删除是一种反模式。
答案 1 :(得分:2)
您将要在此实例中重新考虑您的数据模型。以下是标题为“When to use an index”的DataStax文档的摘录:
[C]在一个极低基数列上重新编写索引,如a 布尔列,没有意义。索引中的每个值都变为a 索引中的单行,导致所有false的大行 例如,价值观。索引多个索引列 foo = true和foo = false没用。
改进此方案的一种可能方法是为已访问过的链接保留一个单独的表。访问链接时,您的应用程序会将该链接的数据添加到新表中,而不是更新link_list
表。这样,您将明确知道是否已访问过链接。