为啥 Cassandra 中的超级列不再受青睐?

Posted

技术标签:

【中文标题】为啥 Cassandra 中的超级列不再受青睐?【英文标题】:Why are super columns in Cassandra no longer favoured?为什么 Cassandra 中的超级列不再受青睐? 【发布时间】:2012-08-08 13:23:28 【问题描述】:

我在最新版本中读到,由于“性能问题”,超级列是不可取的,但在哪里没有解释。

然后我阅读了诸如this one 之类的文章,这些文章使用超级列提供了出色的索引模式。

这让我不知道目前在 Cassandra 中进行索引的最佳方法是什么。

    超级列存在哪些性能问题? 在哪里可以找到当前索引最佳做法?

【问题讨论】:

这是一个很好的问题。我认为这个 ebay 技术博客对优化架构有一个很好的低技术(没有太多技术细节)概述。 ebaytechblog.com/2012/07/16/… 但是,如果您喜欢真实的东西,最好阅读每个变更日志和路线图,以便更好地了解问题在哪里,是什么问题以及如何解决问题。阅读量太大,如果能在某个地方系统化就好了,但我在网上也找不到太多。 【参考方案1】:

超级列存在许多问题,其中最重要的是 Cassandra 在查询时必须反序列化超级列的所有子列(即使结果只会返回一个小子集)。因此,在性能受到影响之前,每个超级列可以存储的子列数存在实际限制。

理论上,这可以通过正确索引子列在 Cassandra 中解决,但一致认为复合列是更好的解决方案,并且它们可以在不增加复杂性的情况下工作。

使用复合列的最简单方法是利用CQL 3 提供的抽象。考虑以下架构:

CREATE TABLE messages(
    username text,
    sent_at timestamp,
    message text,
    sender text,
    PRIMARY KEY(username, sent_at)
);

这里的用户名是行键,但我们使用了 PRIMARY KEY 定义,它创建了一组行键和 sent_at 列。这很重要,因为它具有索引该属性的效果。

INSERT INTO messages (username, sent_at, message, sender) VALUES ('bob', '2012-08-01 11:42:15', 'Hi', 'alice');
INSERT INTO messages (username, sent_at, message, sender) VALUES ('alice', '2012-08-01 11:42:37', 'Hi yourself', 'bob');
INSERT INTO messages (username, sent_at, message, sender) VALUES ('bob', '2012-08-01 11:43:00', 'What are you doing later?', 'alice');
INSERT INTO messages (username, sent_at, message, sender) VALUES ('bob', '2012-08-01 11:47:14', 'Bob?', 'alice');

Cassandra 将在后台存储上述插入的数据,如下所示:

alice: (2012-08-01 11:42:37,message): Hi yourself, (2012-08-01 11:42:37,sender): bob
bob:   (2012-08-01 11:42:15,message): Hi,          (2012-08-01 11:42:15,sender): alice, (2012-08-01 11:43:00,message): What are you doing later?, (2012-08-01 11:43:00,sender): alice (2012-08-01 11:47:14,message): Bob?, (2012-08-01 11:47:14,sender): alice

但是使用 CQL 3,我们可以使用 sent_at 谓词查询“行”,并返回一个表格结果集。

SELECT * FROM messages WHERE username = 'bob' AND sent_at > '2012-08-01';
 username | sent_at                  | message                   | sender
----------+--------------------------+---------------------------+--------
      bob | 2012-08-01 11:43:00+0000 | What are you doing later? |  alice
      bob | 2012-08-01 11:47:14+0000 |                      Bob? |  alice

【讨论】:

谢谢!说到复合键,Cassandra 是否能够有效地对每一列执行范围查询? SELECT * 从某处 WHERE a > 3 AND a 17 等,假设键是 a, b, c。 或者复合列名(多组件)更适合这种情况? 你能看看这个吗:***.com/questions/11978386/… 有趣。我想使用主键作为 GUID 进行直接访问,但这个复合键似乎也是我想要使用的东西。使用简单的 INDEX 而不是主键是否可以正常工作?

以上是关于为啥 Cassandra 中的超级列不再受青睐?的主要内容,如果未能解决你的问题,请参考以下文章

受 SQLite 多年青睐,C 语言到底好在哪儿?

受 SQLite 多年青睐,C 语言到底好在哪儿?

集科模块化石膏板吊顶为什么受大家青睐呢?

为啥 Cassandra 内部不支持聚合?

cassandra thrift:追加数据

为啥 Cassandra 不允许通过 IN 限制查询集群键?