从MySql到NoSql 我现在有了Mysql
这是我的数据库: 我经常使用边界框按位置搜索用户 还有两个表:用户标签和标签。整个数据库大小约为1 Gb 我已经用这些表实现了一个任意标记系统,这样当用户想要使用尚未创建的标记时,这个标记就会插入到标记表中 我还通过标签搜索用户 基准 除了主键上的索引外,我在这个数据库中没有索引 正如您所看到的,有很多插件,它们需要很多时间 这里的主要问题是耗时的插入和更新 使用标记创建新事件(~150ms): 更新事件(~200ms): 此解决方案中我不喜欢的内容:从MySql到NoSql 我现在有了Mysql,mysql,mongodb,nosql,Mysql,Mongodb,Nosql,这是我的数据库: 我经常使用边界框按位置搜索用户 还有两个表:用户标签和标签。整个数据库大小约为1 Gb 我已经用这些表实现了一个任意标记系统,这样当用户想要使用尚未创建的标记时,这个标记就会插入到标记表中 我还通过标签搜索用户 基准 除了主键上的索引外,我在这个数据库中没有索引 正如您所看到的,有很多插件,它们需要很多时间 这里的主要问题是耗时的插入和更新 使用标记创建新事件(~150ms): 更新事件(~200ms): 此解决方案中我不喜欢的内容: 当我创建新用户时,我会在3个表中插入
{
"name": "Dan",
"lat": 60
"lon": 30
"tags":["football", "fishing"]
}
我将能够在标签和lat和lon上设置索引,以加快搜索速度
我的问题
这两种技术都可能解决您的问题。有些场景使用RDBMS更容易处理,而另一些场景则使用更专业的数据库。这取决于您的需求、经验和个人偏好的细节 @mvp对“SQL的便利性”发表了评论。就我个人而言,我觉得SQL是一个很大的难题,因为面向对象和SQL不容易映射。人们经常使用他们的ORM庞然大物,我发现这是一种反模式——ORM代码的大小很可能是整个应用程序代码的50倍以上,因此有些东西是可疑的。但这只是我的观点,SQL仍然可能是最常见的数据存储 就我个人而言,我觉得您的问题很好地映射到MongoDB,因为
- 它具有地理索引并支持各种地理查询
- 如果您需要的话,创建简单的标记是非常容易的
- 这很容易,处理几GB的数据也很容易
- 这很容易管理。我不需要干涉
或其他类似规模的事情innodb\u buffer\u pool\u size
- 连接被高估了。连接是必需的,因为您要将属于一起的数据拆分成表。如果您想找到诸如“喜欢足球和生活在foo中的用户也喜欢”之类的问题的答案,聚合框架和缓存比大型连接更简单、更具可扩展性
顺便说一句,reddit上的三篇文章互相引用:pastebin上的“不要使用MongoDB”、news.ycombinator.com上的Eliot Horowitz的回答以及“MongoDB的故事是一个骗局”,因此,不,MongoDB不仅仅是随机崩溃,还有无数的bug。但是,当然,它不是一颗能神奇地消除缩放问题的银弹。嗨,它是~1GB。但我正在考虑未来的增长。1GB算不了什么。你最好还是坚持使用MySQL。如果您有1TB,那将是另一个问题,考虑NoSQL将是合适的。是的,您的大小是正确的。但是,关于无模式,您会怎么说呢?因此,在更新和创建时,我只需要在一个集合中进行写入或更新(这是关于我的任意标记系统)?NoSql将加速这一部分。NoSql是一种非规范化。加快一种查询类型的速度可能会更好。但它会使其他一些查询(尤其是连接)变慢,甚至几乎不可能。但是您可以在一个文档中嵌入多个实体(就像我使用标记所做的那样)。或者,如果我还有一个名为Events的表,它将包含用户创建的事件。在这个表中,我将有一个athor_id列。若我需要按作者查找所有事件,我只需要一个查询,其中author\u id==user\u id。我只需再查询一次数据库。我会尝试一下)我还在寻找另一个选项:你们知道db有地理索引,并像mongo一样提供灵活性吗?只是为了与之比较。CouchDB有一个插件。维基百科上有一个较长的列表,但我没有使用其中任何一个:似乎mongo是唯一的选择。根据你的回答,我知道你已经使用mongo好几次了。你在使用它的过程中遇到过什么严重的问题吗?没有。有一些注意事项需要注意,但我想这对于任何数据存储都是正确的。如果不小心(磁盘和RAM),它可能会消耗大量内存,释放空间也很棘手,但除此之外,一切都很有魅力。