对于一个新项目,我希望将MySQL,Sphinx和MongoDB结合起来。 MySQL用于关系数据和搜索数值,Sphinx用于自由文本搜索,MongoDB用于地理数据。就我的(快速)基准测试而言,MongoDB是地理查询最快的,用于自由文本搜索的sphinx和用于关系数据搜索的MySQL。因此,为了获得最佳性能,我可能需要将它们组合在我的项目中。
但是有三个缺点。
所以问题是我应该将这三个结合起来,留下一个(可能是MongoDB并使用Sphinx进行地理数据),甚至只使用一个(MongoDB或MySQL)?
为了了解数据,关系数据为aprox 6GB,地理数据约为4GB,自由文本数据约为16GB。
答案 0 :(得分:2)
如果3 dbs中包含的记录/集合/文档具有数据库间引用,则不太清楚。 EG如果用户名,作业,电话号码在Mysql中,用户地址在Mongo中。我假设答案是肯定的。
建议不要使用3种不同的存储解决方案,因为:
1)(最重要)您无法聚合来自2个数据库的数据(以可扩展的方式)。
实施例: 假设您在Mysql中保留用户数据(用户名),在Mongo中保留用户地理坐标。您无法在两个dbs上的字段上查询过滤器/排序。例如,您不能:
SELECT all users
WHERE name starts with 'A'
SORT BY distance_from_center
同样适用于Sphinx。
解决方案:您要么限制单个数据库上的可用数据,要么将数据从一个数据库复制/镜像到另一个数据库。
2)维护成本:维护3台服务器,不同的备份/冗余策略,不同的扩展策略;开发成本:开发人员必须使用3个查询库,3种不同的查询方式等等。
3)必须手动处理的不一致/同步问题(EG你想在mongo和mysql中插入数据;假设mongo写了数据,但是mysql提出了参照完整性异常,所以现在你有一个dbs之间的不一致)4)关于硬件成本,唯一的RAM-eater是MongoDB(建议它必须包含ram中的所有索引)。对于MySQL和Solr服务器,您可以控制内存消耗。
我会做什么:
如果我不需要所有SQL功能(如事务,参照完整性,联接等),我会选择Mongo
如果我需要这些功能,而且我的地理位置操作性能较低,我会使用MySQL
现在,如果我需要(我的意思是,我真的需要)全文搜索,并且Mongo / Mysql FTS功能还不够,我还会附加一个FTS服务器,如Sphinx,Solr,Elasticsearch等