【发布时间】:2016-03-01 10:14:03
【问题描述】:
我在某处读到,对于在标准列族中具有数千列的行,更好的设计将它们拆分为超级列,并且这样做,读取将非常有效,因为 cassandra 只需要加载和返回给定超级列名下的列,而不是加载并可能返回数以千计的列。谁能确认一下?
【问题讨论】:
标签: cassandra
我在某处读到,对于在标准列族中具有数千列的行,更好的设计将它们拆分为超级列,并且这样做,读取将非常有效,因为 cassandra 只需要加载和返回给定超级列名下的列,而不是加载并可能返回数以千计的列。谁能确认一下?
【问题讨论】:
标签: cassandra
这不是一个好建议。在这一点上,超级列是最佳解决方案的用例非常少。新的 CompositeTypes 是历史上大多数超级列的更好解决方案。
话虽如此,听起来您在这里也不需要 CompositeTypes。确实,如果您正在阅读一个非常大的行,您不应该一次拉回整行。相反,您应该在连续的切片中获取行的一部分。
基本上,您将执行一系列get_slice()s。对于第一个,将列数设置为 1000,列开始为“”。然后,从那组结果中取出最后一个列名(称为 X),并再次调用 get_slice(),列数为 1000,但这一次,将列 start 设置为 X。丢弃返回的第一列(它将是 X),然后重复整个 get_slice() 过程,直到查询返回少于 1000 列,这表明您已经到达行尾。
您可能希望一次获取多于或少于 1000 个,具体取决于您的列大小。
【讨论】:
如果会有很多列或者数据应该被索引,那么最好创建一个普通的列族,因为:1)超级CF子列不被索引,2)任何对子列的请求都会反序列化所有超级列中的子列。但是,这可能只是当前代码库的一个限制,请参阅http://wiki.apache.org/cassandra/CassandraLimitations
【讨论】:
CREATE TABLE 多列和超级列有什么区别?因为感觉和我一样……