如何提高cassandra中索引数据的性能

问题描述:

Cassandra没有像like clause.... in MySQL这样的一些CQL来搜索数据库中更具体的数据。如何提高cassandra中索引数据的性能

我已经通过一些数据看上去并提出了一些想法

1.使用的Hadoop

2.使用MySQL服务器是我的花药数据库服务器

但是它有什么我可以改进我的方法Cassandra DB表现更容易?

改善你的Cassandra DB性能可以用很多方式完成,但我觉得你需要高效地查询数据,这与数据库本身的性能调整无关。如您所知,Cassandra是一个nosql数据库,这意味着在处理它时,您牺牲了查询的灵活性以实现快速读取/写入以及可扩展性和容错性。这意味着查询数据会稍微困难一些。有很多模式可以帮助你查询数据:

知道你需要提前。由于使用CQL查询的灵活性稍低于RDBMS引擎中的灵活性,因此可以利用快速读写操作并通过复制将要查询的数据保存为正确的格式。太复杂了?

Imagine you have a user entity that looks like that: 

{ 
    "pk" : "someTimeUUID", 
    "name": "someName", 
    "address": "address", 
    "birthDate": "someBirthDate" 
} 

如果你坚持这样的用户,您将获得的顺序,他们加入你的数据库(你坚持他们)用户的排序列表。假设您想要获得相同的用户列表,但只能列出名为“John”的用户。使用CQL可以做到这一点,但效率稍低。你在这里可以做些什么来修正这个问题,就是通过复制数据来解除数据规范化,以适应你将要执行的查询。你可以阅读更多关于此这里:

http://arin.me/blog/wtf-is-a-supercolumn-cassandra-data-model

然而,这种方法似乎确定了简单的查询,但对于复杂的查询,它是有点难以实现,也,如果你不确定你要查询什么事先,您无法事先以正确的方式存储数据。

Hadoop来救援。如您所知,您可以使用hadoop的map reduce来解决涉及大量数据的任务,根据我的经验,Cassandra数据可能变得非常大。使用hadoop,为了解决上述问题,您可以按照原样迭代数据,在每个映射方法中查找用户是否命名为John,如果是,则写入上下文。

这里是伪代码是什么样子:

map<data> { 
if ("John".equals(data.getColumn("name")){ 
    context.write(data); 
} 
} 

在地图方法的末尾,你最终会与谁是名为John的用户列表。 Youl可以将时间范围(范围分段)放在您提供给hadoop的数据上,这将使您在一段时间内加入数据库的所有用户都被授予 ,并被命名为John。正如你所看到的,在这里你有更多的灵活性,你几乎可以做任何事情。如果您获得的数据足够小,则可以将它作为摘要数据放入某个RDBMS中,或者将其缓存到某处,以便对相同数据的更多查询可以轻松检索它。你可以在这里阅读更多关于Hadoop的:

http://hadoop.apache.org/

+0

谢谢!你帮了我很多! – LiJung 2012-08-09 09:18:42

+0

很高兴我能帮到你。 – 2012-08-09 09:21:50

+0

如果我在mysql中创建副本并在需要时将索引编制索引。这是一个好主意吗? – LiJung 2012-08-10 09:34:16