2011-07-27 94 views
2

对于一个新项目,我期待结合MySQL,Sphinx和MongoDB。用于关系数据和搜索数值的MySQL,用于自由文本搜索的Sphinx和用于地理数据的MongoDB。就我的(快速)基准测试而言,MongoDB是最快的地理查询,sphinx用于自由文本搜索,MySQL用于关系数据搜索。所以为了获得最佳性能,我可能必须将它们结合到我的项目中。结合MySQL,Sphinx和MongDB。好主意?

然而,这有三个缺点。失败的

  1. 三点,即狮身人面像,MySQL和MongoDB的会崩溃 将停止我的网站
  2. 我需要在三个数据库中的数据,并需要保持他们最新 (所有数据只改变者每天所以它不是最糟糕的问题)。
  3. 硬件要求和主要内存正在通过屋顶 ,因为所有数据库都希望有大部分内存是 能够执行。

所以问题是我应该把三者结合起来,让一个出来(可能是MongoDB并且使用Sphinx作为地理数据),或者甚至只用一个(MongoDB或MySQL)?

为了给出关于数据的想法,关系数据是aprox 6GB,地理数据大约4GB,而自由文本数据大约16GB。

+0

您的活动数据集是否大于您可以负担的RAM? –

+0

编辑我的问题,也许它不是我能负担得起的,但随着数据的增长,只有1个数据库更有效率? – Nin

回答

2

如果包含在3个数据块中的记录/集合/文档具有数据库间引用,我们是不是很了解。 EG如果用户名,作业,电话号码在Mysql中并且用户地址在Mongo中。我会假设答案是肯定的。

不建议有3个不同的存储解决方案恕我直言,这是因为:

1)(最重要的),你不能从2个DB的汇总数据(可伸缩的方式)。

例如: 假设您保留Mysql中的用户数据(用户名)和Mongo中的用户地理坐标。您无法查询对两个dbs上的字段进行过滤/排序。例如,您不能:

SELECT all users 
WHERE name starts with 'A' 
SORT BY distance_from_center 

同样适用于狮身人面像。

解决方案:您可以限制单个数据库上可用的数据,也可以将数据从一个数据库复制/镜像到另一个数据库。 2)维护成本:3台服务器维护,不同的备份/冗余策略,不同的缩放策略; 3)维护成本:3台服务器维护,不同的备份/冗余策略,不同的缩放策略;开发成本:开发人员必须使用3个查询库,有3种不同的查询方式等等。

3)必须手动处理的不一致/同步问题(EG要在mongo和mysql中插入数据;假设mongo写了数据,但是mysql提出了参照完整性异常,所以现在你的dbs之间有不一致)

4)关于硬件成本,唯一的RAM-eater是MongoDB(建议它必须在RAM中有所有索引)。对于MySQL和Solr服务器,您可以控制内存消耗。

我会怎么做:

  • 如果我不需要所有的SQL功能(如交易,参照完整性,连接等),我会蒙戈

  • 去如果我需要如果我需要(我的意思是,我真的非常需要)全文搜索和Mongo/Mysql FTS功能,那么我就可以在地理操作中使用较低的性能,我会用MySQL

  • 现在,是不够的,我会附加一个FTS服务呃像Sphinx,Solr,Elasticsearch等

+0

谢谢你的回答。我并不担心1)和3),因为我们的数据的性质都可以在我们的应用程序中处理。 2)然而是一个大问题。我之前使用MySQL FTS的经验非常糟糕,也许现在他们有更好的表现,我会测试它。我用mongo进行的测试表明它不能处理大量小文档(例如具有5个数字字段的100M文档)。所以它可能只有MySQL然后...... – Nin

+0

在mongo上,确保使用正确的索引(请参阅http://www.mongodb.org/display/DOCS/Explain),并且索引可以加载到内存中(请参阅db .stats()http://www.mongodb.org/display/DOCS/Monitoring+and+Diagnostics#MonitoringandDiagnostics-mongoShellDiagnosticCommands) –