2011-09-16 50 views
4

我在某处读到这样的信息,表明对于在标准列族中有成千上万列的行,更好的设计将它们拆分为超级列,并且通过这样做,读取将非常有效,因为cassandra只需要在给定的超级列名下加载和返回列,而不是加载并可能返回列的thoudsands。任何人都可以确认吗?标准列家族vs超级列家族

回答

6

这不是很好的建议。此时,超级列是最佳解决方案的用例数量非常少。对于大多数历史上使用的超级柱,新的CompositeTypes是更好的解决方案。

说了这话,听起来好像你在这里也不需要CompositeTypes。确实,如果你阅读的是一个非常大的行,你不应该一次拉回整行。相反,您应该在连续的切片中获取部分行。

基本上,您将执行一系列get_slice() s。对于第一个,将列数设置为例如1000,并且列开始为“”。然后,从该组结果中取出最后一个列名称(称为X),并调用列计数为1000的另一个,但这次将列开始设置为X.放弃返回的第一列(它将是X),然后重复整个get_slice()进程,直到查询返回少于1000列,这表示您已经击中行的末尾。

根据您的列大小,您可能希望一次获取多于或少于1000个数据。

+0

请注意,返回小于1,000列的查询可能不会以信号结束。根据我的经验,我有时候会收到较少的专栏。你应该阅读,直到它返回零。反正可能是一个更简单的算法。另外,我很高兴您指定要阅读的行数取决于列的大小。我经常使用100个,因为我的一些列有大量的数据。 –

0

如果将有许多列或数据应该被索引,那么最好创建一个正常的列族,因为:1)超级CF子列未被索引,以及2)对子列的任何请求反序列化全部超级列中的子列。但是,这可能是当前代码库的一个限制,请参阅http://wiki.apache.org/cassandra/CassandraLimitations

+0

CQL'CREATE TABLE'与多列和超列之间有什么区别?因为感觉和我相当... –