【问题标题】:From MySql to NoSql [closed]从 MySql 到 NoSql [关闭]
【发布时间】:2013-01-24 00:53:52
【问题描述】:

我现在用 Mysql 得到了什么

这是我的数据库:

我经常使用边界框按位置搜索用户。

还有两个表:user_tag 和 tags。整体数据库大小约为 1 Gb

我已经用这些表实现了一个任意标签系统,所以当用户想要使用尚未创建的标签时,这个标签被插入到标签表中。

我也通过标签搜索用户。

基准测试

除了主键上的索引之外,我在这个数据库中没有索引。

如您所见,插入内容很多,而且需要很长时间。

这里的主要问题是耗时的插入和更新。

使用标签创建新事件(~150ms):

http://pastebin.com/vyw6qhrN

更新事件(~200ms):

http://pastebin.com/f28yvn9z

我不喜欢这个解决方案:

  1. 当我创建新用户时,我会在 3 个表中插入以将用户与其标签链接起来。
  2. 在更新用户信息时,我还需要在用户更改标签时进行 3 次更新和 1 次删除或插入。
  3. 按标签搜索用户变得非常混乱(复杂查询)(How to implement tag system)

我可以使用 NoSql 获得什么

我想使用面向文档的数据库。那么我只需要一个集合:

{
"name": "Dan",
"lat": 60
"lon": 30
"tags":["football", "fishing"]  
}

我将能够在 tagslatlon 上设置索引以加快搜索速度。

我的问题

  1. 我应该切换到 NoSql 还是我可以以某种方式改进我当前的实现。或者可能切换到不同的 RDBMS
  2. 如果我应该切换:在这种情况下哪个 NoSql 数据库是最好的?
  3. 如果我应该切换到 MongoDb:它是否足够可靠和成熟?因为我读过很多关于人们离开 MongoDb 的帖子。例如:http://www.reddit.com/search?q=mongodb

【问题讨论】:

  • 嗨,它是 ~1GB。但我正在考虑未来的增长。
  • 1GB 不算什么。你最好坚持使用 MySQL。如果你有 1TB,那将是不同的问题,考虑 NoSQL 是合适的。
  • 是的,你说得对。但是您对无模式有何看法,以便在更新和创建时我只需要在一个集合中进行写入或更新(这是关于我的任意标签系统)? NoSql 会加快这部分的速度。
  • NoSQL 是一种非规范化。加快一种查询类型可能会很好。但这会使其他一些查询(尤其是联接)变慢甚至几乎不可能。
  • 是的。但是您可以在一个文档中嵌入多个实体(就像我对标签所做的那样)。或者例如,如果我将有一个名为 Events 的表,它将包含用户创建的事件。在这张表中,我将有 athor_id 列。如果我需要按作者查找所有事件,我只需要一个查询,其中 author_id == user_id。我将再对数据库进行一次查询。

标签: mysql mongodb nosql


【解决方案1】:

这两种技术都可以解决您的问题。有些场景使用 RDBMS 更容易处理,而另一些场景则使用更专业的数据库。这取决于您的具体要求、您的经验和您的个人喜好。

@mvp 评论了“SQL 的便利性”。就个人而言,我发现 SQL 是一个主要的痛点,因为面向对象和 SQL 不容易映射。人们经常使用他们的 ORM 庞然大物,我发现这是一种反模式——ORM 代码大小可能是您拥有的整个应用程序代码的 50 倍以上,所以有些东西很可疑。但这只是我的看法,SQL 可能仍然是最常见的数据存储。

就我个人而言,我觉得你的问题很好地映射到了 MongoDB,因为

  • 拥有地理索引,支持各种地理查询
  • 创建简单标签非常容易,如果你需要的话
  • 这很容易,处理几 GB 的数据也很容易。
  • 易于管理。我不需要干涉innodb_buffer_pool_size 或类似的东西。
  • 联接被高估了。需要连接,因为您拆分了属于一起的数据以将其压缩到表中。如果您想找到诸如“喜欢足球并且住在 foo 中的用户也喜欢?”之类的问题的答案,聚合框架和缓存比大连接更容易且更具可扩展性。

如果我是你,我会坐下来试一试:你有一个合理大小的数据集,因此你可以使用真实世界的数据进行测试,并且只更改几个查询应该是很容易。这会很有趣,而且您会亲身感受其优点和缺点。

顺便说一句,reddit 上的三篇文章相互引用:pastebin 上的“不要使用 MongoDB”、news.ycombinator.com 上 Eliot Horowitz 的回答和“MongoDB 的故事是个骗局”,所以没有, MongoDB 不只是随机崩溃并且有无数的错误。但是,当然,它并不是神奇地使缩放问题消失的灵丹妙药。

【讨论】:

  • 我一定会试一试的)我还在寻找另一种选择:您知道具有地理索引并提供 mongo 灵活性的数据库吗?只是为了比较。
  • CouchDB 有一个插件。 Wikipedia 上有更长的列表,但我没有用过:en.wikipedia.org/wiki/Spatial_database
  • 似乎 mongo 是唯一的选择。通过您的回答,我看到您已经多次使用过 mongo。您在使用过程中遇到过什么严重的问题吗?
  • 不,我没有。有一些注意事项需要注意,但我猜对任何数据存储都是如此。如果您不小心(磁盘和 RAM),它可能会占用大量内存(磁盘和 RAM)并且释放空间很棘手,但除此之外,一切都像魅力一样。
猜你喜欢
  • 1970-01-01
  • 2011-02-03
  • 2012-08-05
  • 1970-01-01
  • 2011-02-21
  • 2013-07-29
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多