4

考虑具有以下表结构的 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 表示给定的数据集?

4

1 回答 1

2

你有两个选择:

(1) 有点传统:有一个带有 foo 对象的 CF(列族),每个 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 中。

于 2010-03-10T23:01:15.263 回答