Performance 二级索引上的Cassandra查询非常慢

Performance 二级索引上的Cassandra查询非常慢,performance,cassandra,secondary-indexes,Performance,Cassandra,Secondary Indexes,我们有一个大约40k行的表,查询二级索引很慢(生产时30秒)。我们的卡桑德拉是1.2.8。表架构如下所示: CREATE TABLE usertask ( tid uuid PRIMARY KEY, content text, ts int ) WITH bloom_filter_fp_chance=0.010000 AND caching='KEYS_ONLY' AND comment='' AND dclocal_read_repair_chance=0.0000

我们有一个大约40k行的表,查询二级索引很慢(生产时30秒)。我们的卡桑德拉是1.2.8。表架构如下所示:

CREATE TABLE usertask (
  tid uuid PRIMARY KEY,
  content text,
  ts int
) WITH
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'SnappyCompressor'};

CREATE INDEX usertask_ts_idx ON usertask (ts);
Executing single-partition query on usertask.usertask_ts_idx
当我打开“跟踪”时,我注意到有很多行,如下所示:

CREATE TABLE usertask (
  tid uuid PRIMARY KEY,
  content text,
  ts int
) WITH
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'SnappyCompressor'};

CREATE INDEX usertask_ts_idx ON usertask (ts);
Executing single-partition query on usertask.usertask_ts_idx
只有40k行,看起来在usertask\u ts\u idx上有数千个查询。有什么问题吗?谢谢

更多调查
我在测试服务器上尝试了相同的查询,速度要快得多(prod上30秒,测试服务器上1-2秒)。在比较跟踪日志之后,区别在于在数据文件中寻找分区索引部分所花费的时间。在我们的产品中,每次搜索需要1000-3000微秒,在开发服务器上需要100微秒。我猜我们的生产服务器没有足够的内存来缓存数据文件,因此在数据文件中查找速度很慢。

我认为
ts
是一个时间戳,在这种情况下,这不是一个很好的二级索引候选。原因是它是一个高基数值(即所有值本质上都是唯一的)。这意味着您将在
usertask
中的每一行的索引中得到几乎一行,这将有效地导致连接操作。在分布式数据库上,联接速度非常慢。由于您尚未显示查询,我不确定您到底在做什么,但如果您想根据时间进行查询,则需要重新考虑您的模型。

慢到什么程度?只是在一个有2M行的单节点集群上尝试了这一点,它就成功了。