Cassandra简单查询运行速度很慢

时间:2014-08-21 16:47:38

标签: cassandra cql

我在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

2 个答案:

答案 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表。这样,您将明确知道是否已访问过链接。