Cassandra如何存储文本等可变数据类型

bakd9h0s  于 2023-05-22  发布在  Cassandra
关注(0)|答案(1)|浏览(109)

假设Cassandra将在列族中存储固定长度的数据。类似于柱族:id(bigint)、age(int)、description(text)、picture(blob)。现在描述和图片没有限制。它是怎么储存的?Cassandra是否通过ID -> location方式进行外部化?
例如,在关系数据库中,指针用于指向大文本的实际位置。参见how it is done
另外,在mysql中,建议使用char而不是varchar以获得更好的性能。我想只是因为,没有必要进行“ID查找”。参见:mysql char vs varchar

monwx1rj

monwx1rj1#

Cassandra将单个单元格(列值)存储在其磁盘文件(“sstables”)中,长度为32位,后跟数据字节。因此字符串值不需要有固定的大小,也不需要存储为指向其他位置的指针-完整的字符串在数据文件中显示为原样。
32位长度限制意味着每个“text”或“blob”值的长度限制为2GB,但在实践中,您不应该使用任何接近这个值的内容-使用Cassandra文档suggesting,您不应该使用超过1 MB的内容。具有非常大的值有几个问题:
1.因为值不是
存储为指向其他存储的指针,而是内联存储在sttable文件中,所以每次sstable文件被重写时,即在压缩期间,这些大字符串都会被复制。将巨大的字符串保存在磁盘上的一个单独的文件中并复制指向它的指针会更有效-但Cassandra不这样做。

  1. Cassandra查询语言(CQL)没有任何存储或检索 partial cell的机制。因此,如果您有一个2GB的字符串,您必须完整地检索它--没有办法“分页”通过它,也没有办法增量地写入它。
    1.在Scylla中,大的单元将导致大的延迟尖峰,因为Scylla将原子地处理非常大的单元,而不是上下文切换来做其他工作。在Cassandra中,这个问题不太明显,但仍然可能导致问题(卡在大型单元上的线程将独占CPU,直到被操作系统抢占)。

相关问题