我目前将排名存储在MongoDB (+ nodejs作为API)中。它现在有1000万个记录,所以现在还可以,但是数据集在不久的将来将会急剧增长。
在这一点上,我看到两个选择:
在数据库上执行的查询将不是是文本搜索,而是例如:
一个级别包含一个: 1.域2. url 3.关键字4.关键字语言5.位置6.日期(unix)
需求是能够在不缓存的情况下查询和分析数据。例如,获取域x的所有数据,在日期y、z之间,并分析数据。
最近我注意到性能下降了,我正在查看其他数据库。最适合这份工作的是卡桑德拉,我做了一些测试,看起来很有希望,性能很好。使用亚马逊EC2 + Cassandra似乎是一个很好的解决方案,因为它易于扩展。
因为我不是卡桑德拉的专家,我想知道卡桑德拉是否是最好的选择。第二,什么是最佳实践/数据库模型。
为(简化)收集:
或者把所有的都放在一排:
任何提示、见解都将不胜感激。
发布于 2015-02-16 16:20:05
Cassandra在很大程度上依赖于查询驱动模型。它对查询方式有很大的限制,但可以在这些功能中满足大量的需求。对于任何大型数据库来说,了解查询是很重要的,但就cassandra而言,它几乎是至关重要的。
卡桑德拉有主键的概念。每个主键由一个或多个键(读列)组成。第一列(可能是复合列)称为分区键。Cassandra将分区的所有“行”保存在同一个位置(磁盘上,mem等),分区是复制的单位,等等。
主键中的其他键称为聚类键。分区内的数据根据连续的聚类键排序。例如,如果您的主键是(a,b,c,d),那么数据将通过散列a进行分区,而在分区中,数据将按b、c和d排序。
为了有效地查询,您必须访问一个(或极少数)分区。所以您的查询必须有一个分区键。这必须是完全相等的(没有开头,包含等)。然后你需要过滤到你的目标。这也会变得有趣:
您的查询可以为连续群集键指定完全相等的条件,为查询中的最后一个键指定一个范围(或相等)。因此,在前面的示例中,允许这样做:
从a=a1和b=b1以及c>c1的tbl中选择*;
这不是:
从a=a1、b>20和c=c1的tbl中选择*;
可以对此使用允许筛选。
或
从a=a1和c>20的tbl中选择*;
一旦您了解了数据存储模型,这就有意义了。cassandra用于查询的速度如此之快的原因之一是它将点数据固定在一个范围内并将其分割开来。如果它需要进行挑选,就会慢一些。您可以随时获取数据并过滤客户端。
还可以在列上具有辅助索引。这将允许您在非键列上筛选完全相等的内容。请注意,不要在没有指定分区键的情况下使用带有辅助索引的查询。您将执行一个集群查询,该查询将在实际使用中超时。(例外情况是,如果您使用的是星火和本地是被尊重,但这是完全不同的事情)。
一般来说,将分区大小限制在小于100 or或至多几百meg是很好的。再大一点,你就会有问题。通常,如果需要更大的分区,就会出现错误的数据模型。
通常,您需要将数据还原为多个表,以快速满足所有查询。如果您的模型允许您使用最少的表查询所有需要,那么这是一个非常好的模型。然而,这往往是不可能的,而且去生殖也是必要的。对于您的问题,是否所有这些都在一行中的答案取决于您是否仍然可以查询它,如果所有的内容都在一行中,那么分区大小是否小于100 meg。
对于OLTP,cassandra将是非常棒的,如果您能够构建像Cassandra那样工作的数据模型。通常,OLAP需求将无法满足这一点。使用Cassandra数据的OLAP当前选择的工具是DataStax火花连接器+ Apache。它使用起来很简单,而且非常强大。
那可真是个脑屎。但它应该给你一些想法,如果你想要使用卡桑德拉的真实世界的项目,你可能需要学习的东西。我不是想让你离开卡桑德拉什么的。这是一个很棒的数据存储。但是你必须知道它在做什么来利用它的力量。它的工作原理与蒙戈大不相同,当你切换时,你应该期待着一种心态的转变。这肯定不像从mysql切换到sql服务器。
https://stackoverflow.com/questions/28545220
复制相似问题