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

How does Cassandra store variable data types like text

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

enter code here

`

Cassandra 在其 on-disk 文件(“sstables”)中将单个单元格(列值)存储为 32 位长度,后跟数据字节。因此,字符串值 不需要 需要固定大小,也不会存储为指向其他位置的指针 - 完整的字符串 as-is 出现在数据文件中。

32 位长度限制意味着每个“文本”或“blob”值的长度限制为 2GB,但在实践中,您不应该使用任何接近于此的值 - 使用 Cassandra 文档 suggesting 你不应该使用超过 1MB。具有非常大的值有几个问题:

  1. 因为值 不是 存储为指向其他存储的指针,而是内联存储在 sttable 文件中,这些大字符串在每次 sstable 时都会被复制文件被重写,即在压缩期间。将巨大的字符串保存在磁盘上的单独文件中并只复制指向它的指针会更有效 - 但 Cassandra 不会这样做。

  2. Cassandra 查询语言 (CQL) 没有任何存储或检索 部分 单元格的机制。因此,如果您有一个 2GB 的字符串,则必须完全检索它 - 无法通过它“分页”,也无法增量写入它。

  3. 在 Scylla 中,大单元将导致较大的延迟峰值,因为 Scylla 将以原子方式处理非常大的单元,而不是 context-switch 来执行其他工作。在 Cassandra 中,这个问题不太明显,但仍然可能会导致问题(卡在大单元上的线程将独占 CPU,直到被操作系统抢占)。