考虑具有以下表结构的 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 表示给定的数据集?
最佳答案
你有两个选择:
(1) 有点传统:有一个 CF(列族)和您的 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 中。
关于mysql - 将 MySQL 数据/查询集转换为等效的 Cassandra 表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2413466/