在cassandra中慢选择查询

时间:2016-08-04 09:39:00

标签: java cassandra

我有一个包含3个节点的cassandra集群。有一个表存储大约400M行。我打击下面的选择查询:

SELECT * FROM table_1 WHERE vuid in ('abc','def','ghi');

以上是一个示例查询。在我们的生产环境的子句中有1000个键。下面是表格结构

CREATE TABLE dmp.user_profiles_9 (
    vuid text PRIMARY KEY,
    apnid text,
    brand_model text,
    first_seen timestamp,
    ifa text,
    last_seen timestamp,
    msisdn text,
    total_day_count int,
    total_usage_count int,
    user_type text
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';

“in”子句中有1000个键,查询时间超过5秒。我们需要每天更新上面的数据集。这项工作涉及全表扫描。并且为了尽可能快地完成每次阅读应该更快。在上述情况下可以做些什么?

1 个答案:

答案 0 :(得分:2)

您可以尝试的一种尝试是将IN子句拆分为多个查询,您可以异步执行此操作并将单个结果返回到完整的结果集。

可以找到一个例子,还有一些更多的讨论here

这将阻止只有一个节点进行协调,从而允许将负载正确地分散到其他节点。如果您进行此更改,它也将受益于TokenAware负载平衡策略,以便每次都能查找包含您正在查找的数据的节点。