我目前在MongoDB中存储排名(+ nodejs作为API)。它现在有1000万条记录,所以现在还可以,但数据集在不久的将来会大幅增长。
此时我看到两个选项:
在数据库上执行的查询不是文本搜索,但例如:
排名包含: 域名 网址 3.关键字 4.关键字语言 位置 6. date(unix)
要求是能够在不缓存的情况下查询和分析数据。例如,获取域x的所有数据,在日期y,z之间,并分析数据。
我注意到最近的性能下降,我正在调查其他数据库。似乎最适合这份工作的是Cassandra,我做了一些测试,看起来很有前途,性能很好。使用Amazon EC2 + Cassandra似乎是一个很好的解决方案,因为它易于扩展。
由于我不是Cassandra的专家,我想知道Cassandra是否可行。其次,最佳实践/数据库模型是什么。
为(简化)制作一个集合:
域名(domain_id,名称)
关键字(keyword_id,名称,语言)
排名(domain_id,keyword_id,position,url,unix)
或者将所有内容放在一行:
任何提示和见解都将不胜感激。
答案 0 :(得分:3)
Cassandra在很大程度上依赖于查询驱动的建模。它在查询方式上非常严格,但可以在这些功能中满足大量需求。对于任何大型数据库,了解您的查询很重要,但就cassandra而言,它几乎是至关重要的。
Cassandra有主键的概念。每个主键由一个或多个键(读取列)组成。第一列(可以是复合列)称为分区键。 Cassandra在同一个地方(磁盘,内存等)保留分区的所有“行”,并且分区是复制的单位等。
主键中的其他键称为群集键。分区内的数据根据连续的聚类键排序。例如,如果您的主键是(a,b,c,d),则数据将通过散列a进行分区,并且在分区内,数据将按b,c和d排序。
要进行有效的查询,必须打一个(或很少)分区。因此,您的查询必须具有分区键。这必须是完全相等的(没有开始,包含等)。然后,您需要过滤到目标。这也会变得有趣:
您的查询可以为连续的聚类键指定精确的相等条件,并为查询中的最后一个键指定范围(或相等)。因此,在前面的示例中,允许这样做:
从tbl中选择*,其中a = a1且b = b1且c> C1;
这不是:
从tbl中选择*,其中a = a1且b> 20且c = c1;
[您可以使用允许过滤]
或
从tbl中选择*,其中a = a1和c> 20;
了解数据存储模型后,这是有道理的。 cassandra查询速度如此之快的原因之一是它将数据指向一个范围内并将其拼凑出来。如果它需要选择,那就慢一些。您始终可以获取数据并过滤客户端。
您还可以在列上拥有二级索引。这些将允许您过滤非键列上的完全相等。请注意,在未指定分区键的情况下,永远不要使用带有辅助索引的查询。您将进行群集查询,该查询将在实际使用中超时。 (例外情况是,如果您使用Spark并且地点受到尊重,但这完全是另一回事。)
通常,将分区大小限制为小于100mb或最多几百meg是很好的。任何更大的,你都会有问题。通常,需要更大的分区表明数据模型不好。
通常,您需要将数据反规范化为多个表,以便快速满足您的所有查询。如果您的模型允许您使用尽可能少的表来查询所有需求,那么这是一个非常好的模型。通常这可能是不可能的,并且非正规化将是必要的。对于你的问题,是否所有内容都在一行中的答案取决于你是否仍然可以查询它并且如果所有内容都在一行中,那么分区大小是否小于100兆。
对于OLTP,如果您可以构建与Cassandra一样的数据模型,那么cassandra将会非常棒。这通常不会满足OLAP要求。当前使用Cassandra数据的OLAP选择工具是DataStax Spark连接器+ Apache Spark。它使用起来非常简单,而且非常强大。
这是一个大脑转储。但是,如果您打算将Cassandra用于实际项目,它应该会让您了解可能需要学习的内容。我不是想让你离开卡桑德拉或任何东西。这是一个很棒的数据存储。但你必须了解它正在做些什么来利用它的力量。它与Mongo的工作方式非常不同,你应该期待切换时的转换。它绝对不像从mysql切换到sql server。