带有复合键的 Cassandra 紧凑型存储选项
Cassandra compact storage option with compound keys
紧凑型存储在 table 情况下如何工作:
Table Index {
userid
keyword
score
fid
PRIMARY KEY (userid, keyword, score)
}
不要注意我的语法错误table:)
假设有一个关键字包含 6 个 fID,分为 3 组不同的分数。 cassandra如何在物理层存储数据?
为了对此进行测试,我使用上面的 PRIMARY KEY 创建了您的示例模式(使用 WITH COMPACT STORAGE
),并且 运行 这 6 个 INSERT
s:
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',87,1);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',87,2);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',21,3);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',21,4);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',44,5);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',44,6);
请注意,由于您的 PRIMARY KEY 定义,我最终得到了这三个 CQL 行:
userid | keyword | score | fid
--------+--------------+-------+-----
3 | Star Wars | 21 | 4
3 | Star Wars | 44 | 6
3 | Star Wars | 87 | 2
(3 rows)
Cassandra PRIMARY KEY 的特点是它们是独一无二的。所以如果你想确保唯一性到fID,那么你应该让它成为PRIMARY KEY的最后一部分...... PRIMARY KEY(userid,keyword,score,fID)这将确保唯一性,并且仍然允许你排序按关键字和分数。
要查看它们在物理层面的结构,我可以使用 cassandra-cli
(而不是 cqlsh):
[aploetz@unknown] use Whosebug;
Authenticated to keyspace: Whosebug
[default@Whosebug] list dontnameyourtableindex ;
Using default limit of 100
Using default cell limit of 100
-------------------
RowKey: 3
=> (name=Star Wars:21, value=4, timestamp=1425307959946184)
=> (name=Star Wars:44, value=6, timestamp=1425307961062608)
=> (name=Star Wars:87, value=2, timestamp=1425307959909671)
请注意,WITH COMPACT STORAGE
会阻止 fid
列名称出现,而只会显示具有相应列键的值。
紧凑型存储在 table 情况下如何工作:
Table Index {
userid
keyword
score
fid
PRIMARY KEY (userid, keyword, score)
}
不要注意我的语法错误table:) 假设有一个关键字包含 6 个 fID,分为 3 组不同的分数。 cassandra如何在物理层存储数据?
为了对此进行测试,我使用上面的 PRIMARY KEY 创建了您的示例模式(使用 WITH COMPACT STORAGE
),并且 运行 这 6 个 INSERT
s:
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',87,1);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',87,2);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',21,3);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',21,4);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',44,5);
INSERT INTO dontnameyourtableindex (userid, keyword, score,fid) VALUES (3,'Star Wars',44,6);
请注意,由于您的 PRIMARY KEY 定义,我最终得到了这三个 CQL 行:
userid | keyword | score | fid
--------+--------------+-------+-----
3 | Star Wars | 21 | 4
3 | Star Wars | 44 | 6
3 | Star Wars | 87 | 2
(3 rows)
Cassandra PRIMARY KEY 的特点是它们是独一无二的。所以如果你想确保唯一性到fID,那么你应该让它成为PRIMARY KEY的最后一部分...... PRIMARY KEY(userid,keyword,score,fID)这将确保唯一性,并且仍然允许你排序按关键字和分数。
要查看它们在物理层面的结构,我可以使用 cassandra-cli
(而不是 cqlsh):
[aploetz@unknown] use Whosebug;
Authenticated to keyspace: Whosebug
[default@Whosebug] list dontnameyourtableindex ;
Using default limit of 100
Using default cell limit of 100
-------------------
RowKey: 3
=> (name=Star Wars:21, value=4, timestamp=1425307959946184)
=> (name=Star Wars:44, value=6, timestamp=1425307961062608)
=> (name=Star Wars:87, value=2, timestamp=1425307959909671)
请注意,WITH COMPACT STORAGE
会阻止 fid
列名称出现,而只会显示具有相应列键的值。