按照ebay 技术博客和datastax 开发人员博客中的指示,我在 Cassandra 1.2 中对一些事件日志数据进行建模。作为分区键,我使用“ddmmyyhh|bucket”,其中 bucket 是介于 0 和集群中节点数之间的任意数字。
数据模型
cqlsh:Log> CREATE TABLE transactions (yymmddhh varchar, bucket int, rId int, created timeuuid, data map, PRIMARY KEY((yymmddhh, bucket), created) );
(rId 标识触发事件的资源。)(映射是从 JSON 派生的键值对;键更改,但变化不大)
我假设这会转化为一个复合主键/行键,每小时有 X 个存储桶。我的列名比timeuuids。查询此数据模型按预期工作(我可以查询时间范围。)
问题在于性能:插入新行的时间不断增加。所以我在做某事。错了,但无法确定问题所在。
当我使用 timeuuid 作为行键的一部分时,性能在较高水平上保持稳定,但这会阻止我查询它(没有行键的查询当然会抛出有关“过滤”的错误消息)。
有什么帮助吗?谢谢!
更新
从映射数据类型切换到预定义的列名可以缓解这个问题。现在插入时间似乎保持在每次插入 <0.005 秒左右。
核心问题仍然存在: 我如何高效地使用“map”数据类型?对于数千个插入只有轻微变化的键来说,什么是一种有效的方法。
我在地图中使用数据的键大多保持不变。我理解datastax文档(由于声誉限制无法发布链接,抱歉,但很容易找到)说每个键创建一个额外的列 - 或者它是否为每个“地图”创建一个新列??那将是……我很难相信。