2012-08-11 28 views
23

我已经阅读过最新版本,因为“性能问题”,超级列是不可取的,但没有解释。为什么卡桑德拉的超级柱不再受青睐?

然后,我阅读了文章,如this one,使用超级列提供美妙的索引模式。

这让我不知道什么是当前在卡桑德拉做索引的最好方法。

  1. 超级柱的性能问题是什么?
  2. 我在哪里可以找到当前索引的最佳实践?
+2

这是一个很好的问题。我认为这个易趣科技博客有一个很好的和低技术(没有太多的技术细节)概述优化的体系结构。 http://www.ebaytechblog.com/2012/07/16/cassandra-data-modeling-best-practices-part-1/然而,如果你是真正的东西,更好地阅读每个更新日志和路线图,所以你得到更好地感受问题出在哪里以及如何解决。这是太多的阅读,它会很好,如果它可以系统化的地方,但我也找不到在互联网上。 – 2012-08-11 14:03:00

回答

31

超级列遇到很多问题,其中最重要的一点就是卡索德拉需要在查询时对超级列的所有子列进行反序列化(即使结果只会返回一个很小的值子集)。因此,每个超级列的子列的数量在性能遭受损失之前可以存储的数量是有实际限制的。

理论上,这可以在Cassandra中通过正确索引子列来修复,但共识是组合列是更好的解决方案,并且它们的工作没有增加复杂性。

使用组合列的最简单方法是利用CQL 3提供的抽象。考虑下面的模式:这里

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

用户名是该行关键,但我们使用它创建的行键和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'); 

场景卡桑德拉将存储上面插入的数据是这样的故事:

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 
+0

谢谢!谈到组合键,Cassandra能够在每列上高效地执行范围查询吗? SELECT * FROM where where a> 3 AND a <= 12 AND b IN(1,3,6)AND c> 17等,假设关键字是a,b,c。 – IamIC 2012-08-14 01:00:25

+0

或者是这种情况下更好的组合列名称(多组件)? – IamIC 2012-08-14 01:16:25

+0

你可以看看这个请:http://stackoverflow.com/questions/11978386/cassandra-1-1-storage-engine – IamIC 2012-08-16 00:03:10