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