最近,我遇到了在单列系列中从单行高效检索多个列的问题。目前,我使用Pelops作为Cassandra API。问题是如果我想从多个范围中获取列,该怎么办。如果我可以根据一些切片从家里获得专栏,那将很容易,但我不能。
例如,我有一个列有大量列的家庭。其中一些有一个共同的前缀,比如说“group / xxx”,其中xxx是一个标识符。还有一些列以例如“a”,“b”,“c”命名。现在,我想将这些列放在一起,所以我必须定义两个切片并调用两次getColumnsFromRow。
如何在效率方面解决这个问题? Cassandra是否以某种方式缓存了最近检索到的列族,并且第二次调用getColumnsFromRow不会再次搜索它?
答案 0 :(得分:4)
因为您已经推出了自己的复合列名称,所以基本上必须发出多个get_slice调用。
这不是一个非常大的效率明智,因为这些列在同一行,如果您正确选择了比较器,应该是单个磁盘搜索。对同一行的后续查询应该在操作系统的磁盘缓存中触及表的这一部分(操作系统级别,与Cassandra无关)。
行缓存是为小行设计的,其中频繁访问整个内容(如序列化对象或类似对象)。他们实际上会对像这样的大行施加大量的内存压力。我建议为此CF禁用行缓存。
如果您发现需要,可以通过进行以下调整进行一些额外的调整: - 拒绝read_repair_chance - 启用“结果固定”:https://github.com/apache/cassandra/blob/cassandra-0.7.0/conf/cassandra.yaml#L229-236
这将使您的0S'S文件系统缓存更有效地工作,因为相同的主机将处理相同的查询,并且后续切片将在理想情况下在相同的SSTable中并且因此在FS缓存中的行的部分上操作。
(无耻插件 - 但在这些情况下实际上非常有用)另外,考虑免费下载OpsCenter(http://www.datastax.com/opscenter),并在试验不同时观察列系列的指标选项。这将让您了解专门为您的数据构建查询的最有效方法。
答案 1 :(得分:1)
Cassandra确实有可选的行缓存,但如果您的行非常大,这可能会花费大量内存,因此可能不建议这样做。
(使用存储配置中的rows_cached,row_cache_save_period_in_seconds和preload_row_cache proeprties为每列家庭配置行缓存)
http://wiki.apache.org/cassandra/StorageConfiguration说:
行缓存可以节省更多时间, 但必须存储其全部价值 行,所以非常 空间密集。最好只使用 行缓存,如果你有热行或 静态行。