在我正在工作的项目中,客户端有一个旧的大型(TB级)RDBMS。所有类型的查询都很慢,没有时间来修复/重构模式。我已经确定了需要优化的常见查询集。该集分为两部分:全文和元数据查询。
我的计划是从数据库中提取数据,并将其分配到两个不同的存储系统,每个存储系统都针对特定查询集进行了优化。
对于全文搜索,Solr是最有意义的引擎。它的分片和复制功能使其非常适合一半的问题。
对于元数据查询,我不确定要采取的路线。目前,我正在考虑使用具有极度非规范化模式的RDBMS,该模式表示来自“权威”RDBMS的数据的特定子集。但是,与已经包含它们的Solr相比,我的客户担心这种子系统缺少分片和复制以及设置这些功能的难度/复杂性。在这种情况下,元数据采用整数,日期,bool,位和字符串的形式(最大大小为10chars)。
是否有一个数据库存储系统具有内置的分片和复制功能,可能对查询所述元数据特别有用?也许一个没有sql的解决方案提供了一个很好的查询引擎?
请点亮。
附加/回应:
Solr可用于元数据,但元数据是易失性的。因此,我必须经常提交索引。这会导致搜索速度非常快。
答案 0 :(得分:22)
<强> RavenDB 强>
缺点:它是AGPL许可的。根据您的开发/服务器环境,您可以认为它在.NET上运行。此外,我不知道除.NET之外的其他平台的客户端状态。
<强> Solandra 强>
缺点:尚未发布。
<强> ElasticSearch: 强>
ElasticSearch看起来与RavenDB类似,但它似乎emphasize full-text search,其中RavenDB强调成为一般的NoSQL数据库。
答案 1 :(得分:4)
将 MongoDB 用于元数据存储:
然而,缺点是您无法执行联接。明智地对数据进行非规范化,以便避免这种情况。
答案 2 :(得分:2)
我确信您知道在任何频繁更新的系统上都不会获得快速查询时间。要针对RDBMS实现自己的分片,您需要找到一些密钥来分割记录并填充多个数据库。然后,您可以同时查询它们以获取和处理地图缩减方式中的数据。这样可以在数据增长时增加机器数量,并可能允许您提高操作速度。通过快速谷歌搜索,MongoDB和Hadoop都提供了这种map / reduce功能,我对这两者都不熟悉。
在运行中生成复杂的长时间运行报告并不罕见。但是,这通常伴随着报告生成完成后的电子邮件通知。它为与人类接口提供了良好的推送通知格式。此外,如果预期这些报告是以周期性方式(例如每周,每月等),您仍然可以在这些报告准备就绪时使用电子邮件通知,唯一的区别是生成的启动时间是自动的。
答案 3 :(得分:2)
如果使用elasticsearch,您只需将元数据添加为json文档的额外键:
{
"message": ... your full text,
"date": "2009-11-15T14:12:12",
...
}
然后你可以同时搜索这两个。否则,如果您仍然想要执行这两种系统方法,monogoDB是一个具有自动分片的文档存储,它具有一些非常高级的查询机制(字段,map-reduce,用于快速查询的索引)。