我们有一个大约 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 微秒。我猜我们的生产服务器没有足够的内存来缓存数据文件,因此在数据文件中查找速度很慢。