微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将MySQL数据/查询集转换为等效的Cassandra表示

考虑一个具有以下表结构的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(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中.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐