考虑具有以下表结构的5亿行MySQL表...
CREATE TABLE foo_objects (
id int NOT NULL AUTO_INCREMENT,
foo_string varchar(32),
metadata_string varchar(128),
lookup_id int,
PRIMARY KEY (id),
UNIQUE KEY (foo_string),
KEY (lookup_id),
);
...仅使用以下两个查询进行查询...
# lookup by unique string key, maximum of one row returned
SELECT * FROM foo_objects WHERE foo_string = ?;
# lookup by numeric lookup key, may return multiple rows
SELECT * FROM foo_objects WHERE lookup_id = ?;
鉴于这些查询,您将如何使用Cassandra表示给定的数据集?
答案 0 :(得分:2)
您有两种选择:
(1)有点传统:有一个CF(columnfamily)与你的foo对象,每个foo一行,每个字段一列。然后创建两个索引CF,其中一行中的行键是字符串值,另一行中的行键是lookup_id。索引行中的列是foo id。所以你在索引CF上做了一个GET,然后返回了一个关于id的MULTIGET。
请注意,如果您可以使id与lookup_id相同,那么您只需要维护一个索引。
像Digg的lazyboy(http://github.com/digg/lazyboy)这样的高级客户将为您自动维护索引CF. Cassandra本身并没有自动执行此操作。
(2)与(1)类似,但是您将整个foo对象复制到索引行的子列中(即索引顶级列是超级列)。如果您实际上没有通过foo id本身进行查询,则根本不需要将其存储在自己的CF中。