cassandra - “冗余”聚类列有什么缺点吗?
问题描述
我注意到在某些情况下,将常规 Cassandra 列更改为集群列可以显着减小表的大小。
对于此示例表:
id UUID K
time TIMESTAMP C
state TINYINT (C)
value DOUBLE
state
如果是普通列,则 100000 行的大小估计为 3.9 MB ,如果state
是聚类列,则估计为 2.4 MB(使用DataStax 课程 DS220中的方法估计)。
如果您查看数据的物理存储方式,不难看出为什么存在这种差异。在前一种情况下,每个时间戳有两个内部单元格 - 一个 forstate
和一个 for value
。在后一种情况下value
,将合并到单元密钥中,因此每个时间戳只有一个单元,并且时间戳(单元密钥的一部分)仅存储一次。
第二个聚类列不会对可以查询的内容产生任何新的限制。SELECT * FROM table WHERE id=? AND time>=? AND time<?
还可以。
这似乎是一个双赢的局面。是否有任何缺点,特别是在性能方面?
(我能想到的是,如果state
是一个常规列,那么它可以从插入中省略,并且state
永远不会创建内部单元格。我想如果state
是一个常规列并且通常被省略,那么表格将比如果state
是一个聚类列。)
附加评论
值得注意的是,在上面的定义中,如果state
没有相等过滤器time
,则无法过滤,这使得它对于过滤不是很有用state
。如果你把state
上面的列time
来解决这个问题,那么是的,你可以过滤state
和time
不等式,但是如果你想要所有状态(IN 子句),那么返回的行首先按顺序返回state
,然后time
,这又不是很有用。
解决方案
1)您每创建一行state
。您的数据模型必须意识到并理解这一点。您可能会为相同的,创建具有不同state
s 的两行,这是原始模型所不允许的。id
time
2)如果您删除,您需要指定state
或创建Range Tombstones
(范围删除,因为您要删除给定id
and的所有行time
,但它可能是state
s 的范围)。范围墓碑在 2.1 中特别昂贵(在读取路径上),并且TombstoneOverwhelming
直到最近的 Cassandra 版本才在异常处理程序中正确考虑,因此避免范围墓碑通常是一个好主意,除非您确实需要它们。
推荐阅读
- apache-nifi - Windows机器上的apache nifi 1.7.1重启问题
- jquery - jQuery - 匹配具有相同数据的元素
- javascript - 附加文件后动态更改回形针图标,改为显示文件图标。
- javascript - 如何使用 ajax 读取外部 docx 文件内容
- javascript - 如何获取 Chrome 浏览器的所有传入 IP 连接列表?
- python - 如何访问jinja2.Template的环境
- python - 如何在 Django 管理自定义列中获取请求参数?
- php - Wordpress PHP - 你如何将帖子缩略图移动到帖子标题和摘录下方
- python - 如何测试更复杂的功能?
- web-component - 将一些外部 js 导入 Stenciljs Web 组件时出现问题