Cassandra 没有像like clause.... in MySQL
这样的CQL来搜索数据库中更具体的数据。
我查看了一些数据并提出了一些想法
1.使用 Hadoop
2.使用 MySQL服务器作为我的另一个数据库服务器
但是,有什么方法可以让我更轻松地提高 Cassandra DB 性能吗?
答案 0 :(得分:1)
提高Cassandra数据库性能可以通过多种方式完成,但我觉得您需要有效地查询数据,这与数据库本身的性能调整无关。
如您所知,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,为了解决上面的例子,你将按原样迭代数据,在每个map方法中查找用户是否被命名为John,如果是,则写入上下文。
以下是伪代码的外观:
map<data> {
if ("John".equals(data.getColumn("name")){
context.write(data);
}
}
在map方法的最后,您最终会得到一个名为John的所有用户的列表。你可以为你提供给hadoop的数据设置一个时间范围(范围切片) 在一段时间内加入数据库并命名为John的所有用户。如你所见,这里你有更多的灵活性,几乎可以做任何事情。如果您获得的数据足够小,您可以将其作为摘要数据放入某些RDBMS中或将其缓存到某处,以便对相同数据的进一步查询可以轻松地检索它。你可以在这里阅读更多关于hadoop的内容: