Cassandra 卡桑德拉Cql范围选择

Cassandra 卡桑德拉Cql范围选择,cassandra,Cassandra,我们来自RDBMS背景,我们正在尝试将现有的数据存储移植到cassandra,以利用分布式数据库的强大功能。 我们的要求是存储关于键的值,键可能是时间(计划使用纪元时间),并检索键范围之间的值 对于测试,我们使用cql(通过cqlsh)创建了ColumnFamily并插入数据: 但是我们的select无法返回正确的数据 select * from Log where KEY>4 and KEY<9; select*from Log where KEY>4和KEY>4以及KEYCas

我们来自RDBMS背景,我们正在尝试将现有的数据存储移植到cassandra,以利用分布式数据库的强大功能。 我们的要求是存储关于键的值,键可能是时间(计划使用纪元时间),并检索键范围之间的值

对于测试,我们使用cql(通过
cqlsh
)创建了ColumnFamily并插入数据:

但是我们的select无法返回正确的数据

select * from Log where KEY>4 and KEY<9;

select*from Log where KEY>4和KEY>4以及KEYCassandra禁止此类查询有一个很好的理由。目前,通过使用主键的md5和,所有日志条目都均匀地分布在节点上。支持您的查询意味着Cassandra必须查询所有节点、检索所有条目、将它们存储在磁盘上并对它们进行排序。无论何时执行此查询,都需要这样做

如果希望能够执行此查询,您可以使用保留顺序的Partioner,但也不建议这样做,因为如果您按顺序插入数据,那么所有查询都将命中单个节点,从而导致不需要的热点

通常的解决方案是使用复合主键(例如,index_name+timeuuid)。这将通过使用indexname的md5sum确保索引均匀分布在集群中。但是访问索引(例如,从日志中选择*,其中索引名称=?和时间>=?和时间<?
)仍然有效,因为数据已按排序顺序存储在负责
md5sum(索引名称)
的节点上。索引名通常是帮助您对数据进行分区的一些键-用户id或应用程序id可能是一个很好的候选项

如果您认为单个索引名称的索引对于单个节点来说可能太大,那么可以通过将当前年份和月份添加到索引名称来调整以前的模式。有关更多信息,请阅读以下两篇文章:

select * from Log where KEY>4 and KEY<9;
select * from Log where KEY>4 and KEY<9;