我有一个susbcriber表,它将包含数百万个数据。
在cassandra中,表模式如下所示-
CREATE TABLE susbcriber (
id int PRIMARY KEY,
age_identifier text,
alternate_mobile_identifier text,
android_identifier text,
batch_id text,
circle text,
city_identifier text,
country text,
country_identifier text,
created_at text,
deleted_at text,
email_identifier text,
gender_identifier text,
ios_identifier text,
list_master_id int,
list_subscriber_id text,
mobile_identifier text,
operator text,
partition_id text,
raw_data map<text, text>,
region_identifier text,
unique_identifier text,
updated_at text,
web_push_identifier 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 = 0
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';
我不得不在上面做过滤查询 'raw_data map<text, text>,'
此列包含json值和键,如何对数据进行建模,以使select和update的性能更快?
我正在尝试实现一些批量更新操作。
任何建议都将不胜感激。
1条答案
按热度按时间pepwfjgg1#
如果数据已经存在于Map中,那么实际上不需要将值也保留在它们自己的列中,如果它只是Map的一个键,那么cassandra更容易将其表示为一个集群键,而不是一个集合,如:
然后您可以通过任何id和键进行查询。如果您正在查找某个特定键的值大于
然后,当你插入你设置碎片
id % 12
或者一些值,这样分区就不会太大(需要根据预期负载进行一些猜测)。然后要查看key=value的所有值,需要查询所有12个shard(异步调用每个shard并合并)。尽管如果键/值对的基数足够低,shard可能是不必要的。然后您将有一个可以查找的ID列表。如果要避免查找,可以向该表中添加额外的键和值,但数据可能会爆炸,这取决于Map中的键数,保持所有内容的更新将非常痛苦。我不推荐但可用的一个选项是索引Map,即:
记住二级索引的问题。