2010-03-09 19 views
4

考虑了一枚500万行的MySQL表如下表结构...翻译一个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来表示给定的数据集?

回答

2

你有两种选择:

(1)之类的传统:有一个CF(ColumnFamily中)与富的对象,每富一行,每场一列。然后创建两个索引CF,其中一个中的行键是字符串值,另一个中的行键是lookup_id。索引行中的列是foo ids。所以你在索引CF上做了一个GET,然后返回了一个关于ID的MULTIGET。

请注意,如果您可以使id与lookup_id相同,那么您有一个较少的索引要维护。

Digg的lazyboy(http://github.com/digg/lazyboy)等高级客户端会自动为您维护索引CF。 Cassandra本身不会自动执行此操作(还)。 (2)与(1)类似,但是将整个foo对象复制到索引行的子列中(即索引顶级列是超级列)。如果你实际上并没有通过foo id本身进行查询,则根本不需要将它存储在自己的CF中。