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

标签 performance cassandra secondary-indexes

我们有一个大约有 40k 行的表,查询二级索引很慢(生产时 30 秒)。我们的 cassandra 是 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

只有 40k 行,看起来 usertask_ts_idx 上有数千个查询。可能是什么问题呢?谢谢

更多调查

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

最佳答案

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

关于performance - 二级索引上的 Cassandra 查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20093181/

相关文章:

cassandra - 验证Cassandra节点同步的方法

c# - DynamoDB : How to query using GSI when you know the partition key but not the sort key?

performance - 当每个字符需要单独放置和格式化时,如何快速渲染文本?

php - 当您只插入几行时,MySQL 中的单个多个 INSERT 是否会在速度上产生很大差异?

java - 以高效的方式计算字符串中出现的字符数?‽?

ubuntu - 由于访问被拒绝异常,Cassandra 未启动

hadoop - Cassandra + Solr/Hadoop/Spark - 选择合适的工具

cassandra - 在cassandra查询中使用主键和辅助索引的性能

node.js - AWS Lambda查询二级索引

sql-server - 加速 SSIS 包(插入和更新)