我有一个包含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秒。我们需要每天更新上面的数据集。这项工作涉及全表扫描。并且为了尽可能快地完成每次阅读应该更快。在上述情况下可以做些什么?
答案 0 :(得分:2)
您可以尝试的一种尝试是将IN子句拆分为多个查询,您可以异步执行此操作并将单个结果返回到完整的结果集。
可以找到一个例子,还有一些更多的讨论here。
这将阻止只有一个节点进行协调,从而允许将负载正确地分散到其他节点。如果您进行此更改,它也将受益于TokenAware负载平衡策略,以便每次都能查找包含您正在查找的数据的节点。