mysql - 结合 MySQL、Sphinx 和 MongoDB。好主意?

标签 mysql database-design mongodb sphinx

对于一个新项目,我希望结合使用 MySQL、Sphinx 和 MongoDB。 MySQL 用于关系数据和数值搜索,Sphinx 用于自由文本搜索,MongoDB 用于地理数据。就我的(快速)基准测试而言,MongoDB 是地理查询最快的,sphinx 是自由文本搜索最快的,而 MySQL 是关系数据搜索最快的。因此,为了获得最佳性能,我可能必须将它们组合到我的项目中。

然而,这有三个缺点。

  1. 三个故障点,即 Sphinx、MySQL 和 MongoDB 可能崩溃 这将停止我的网站
  2. 我需要三个数据库中的数据并且需要使它们保持最新 (所有数据每天只更改一个,所以这不是最糟糕的问题)。
  3. 硬件要求,主要是 RAM 正在飞速发展 因为所有数据库都希望有很大一部分内存 能够执行。

所以问题是我应该将这三者结合起来,省去一个(可能是 MongoDB 并使用 Sphinx 处理地理数据)还是只使用一个(MongoDB 或 MySQL)?

为了了解数据,关系数据约为 6GB,地理数据约为 4GB,自由文本数据约为 16GB。

最佳答案

不太了解 3 个数据库中包含的记录/集合/文档是否具有数据库间引用。 EG如果用户名、职位、电话号码在Mysql中,用户地址在Mongo中。我假设答案是肯定的。

恕我直言,不推荐使用 3 种不同的存储解决方案,因为:

1)(最重要的)您不能聚合来自 2 个数据库的数据(以可扩展的方式)。

例子: 假设您将用户数据(用户名)保存在 Mysql 中,将用户地理坐标保存在 Mongo 中。您不能查询对位于两个数据库上的字段进行过滤器/排序。例如,您不能:

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

同样适用于 Sphinx。

解决方案:您要么限制在单个数据库上可用的数据,要么将数据从一个数据库复制/镜像到另一个数据库。

2)维护成本:维护3台服务器,不同的备份/冗余策略,不同的扩展策略;开发成本:开发者必须使用3个查询库,3种不同的查询方式等等。

3) 必须手动处理的不一致/同步问题(例如,你想在 mongo 和 mysql 中都插入数据;假设 mongo 写入了数据,但 mysql 引发了引用完整性异常,所以现在你有一个数据库之间不一致)

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

我会做什么:

  • 如果我不需要所有 SQL 功能(如事务、引用完整性、连接等),我会选择 Mongo

  • 如果我需要这些功能,并且我可以忍受较低的地理操作性能,我会选择 MySQL

  • 现在,如果我需要(我的意思是,我真的真的需要)全文搜索,而 Mongo/Mysql FTS 功能还不够,我还会附加一个 FTS 服务器,如 Sphinx、Solr、Elasticsearch 等

关于mysql - 结合 MySQL、Sphinx 和 MongoDB。好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6840760/

相关文章:

php - wp_update_user_meta 未按预期更新

javascript - collection.find mongojs同步回调

mysql - 如何在 Docker 容器中设置 'spring.datasource.url'

php - 无法在 php 中关闭 session 和注销

mysql - 左连接而不是 ISSET

python - 如何设计一个数据库来表示结构变化的数据?

mysql - 时间表生成的数据库设计

ruby-on-rails - 从 GMail 导入联系人 - 设计问题

c# - MongoDB C# 驱动程序和 DateTime 字段

node.js - MongoDB 更新对象并删除属性?