`
C_J
  • 浏览: 127856 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

David Mytton为什么从MySQL迁移到MongoDB数据库

阅读更多

题记:

    工作辞了,在家闲着也是闲着,研究了下non-relational数据库,恰巧看到robbin大哥写的“NOSQL数据库探讨”,便迫切想学习下,了解到MongoDB一些基本知识后,就去瞅了下在robbin大哥的文中提及到的一个MongoDB移植案例,如:

“由于Mongo可以支持复杂的数据结构,而且带有强大的数据查询功能,因此非常受到欢迎,很多项目都考虑用MongoDB来替代MySQL来实现不是特别复杂的Web应用,比方说why we migrated from MySQL to MongoDB就是一个真实的从MySQL迁移到MongoDB的案例,由于数据量实在太大,所以迁移到了Mongo上面,数据查询的速度得到了非常显著的提升。”

    从中感到了作者的欢喜和忧愁,有翻译不妥或理解不到位的,还请指正:)

 

1,David为什么要迁移?

 

原文如下:

写道
The problem we encountered was administrative. We wanted to scale using replication but found that MySQL had a hard time keeping up, especially with the initial sync. As such, backups became an issue, but we solved that. However, scaling MySQL onto multiple clustered servers as we plan to do in the future is difficult. You either do this through replication but that is only really suited to read-heavy applications; or using MySQL cluster. The cluster looks very good but I have read about some problems with it and was unsure of it’s suitability for our needs.

 

看上去大概的意思是说:我们遇到了管理上的麻烦,虽然我们解决了备份问题。我们试图通过MySql集群解决,集群看上去很好但对于一个大量写应用来说却遇到了困难,同时我们也不确定集群是否适应我们的需求。

 

于是David选择更换MySQL,选择了MongoDB。

 

2、为什么选择MongonDB?

 

写道
Very easy to install.
PHP module available.
Very easy replication, including master-master support. In testing this caught up with our live DB very quickly and stayed in sync without difficulty.
Automated sharding being developed.
Good documentation.

 我想最重要的一点应该是:Very easy replication, including master-master support. In testing this caught up with our live DB very quickly and stayed in sync without difficulty.

 

 非常容易的数据拷贝并且快速、一致。

 

3、移植MongonDB后的问题。

 

Schema-less:

写道
Schema-less

This means things are much more flexible for future structure changes but it also means that every row records the field names. We had relatively long, descriptive names in MySQL such as timeAdded or valueCached. For a small number of rows, this extra storage only amounts to a few bytes per row, but when you have 10 million rows, each with maybe 100 bytes of field names, then you quickly eat up disk space unnecessarily. 100 * 10,000,000 = ~900MB just for field names!

We cut down the names to 2-3 characters. This is a little more confusing in the code but the disk storage savings are worth it. And if you use sensible names then it isn’t that bad e.g. timeAdded -> tA. A reduction to about 15 bytes per row at 10,000,000 rows means ~140MB for field names – a massive saving.


 

灵活的BSON文本存储结构意味着每条记录都带有了字段名,从而处理不当会导致空间的浪费,于是David减缩了字段名。

 

The database-per-customer method doesn’t work

写道
The database-per-customer method doesn’t work

MongoDB stores data in flat files using their own binary storage objects. This means that data storage is very compact and efficient, perfect for high data volumes. However, it allocates a set of files per database and pre-allocates those files on the filesystem for speed:

This was a problem because MongoDB was frequently pre-allocating in advance when the data would almost never need to “flow” into another file, or only a tiny amount of another file. This is particularly the case with free accounts where we clear out data after a month. Such pre-allocation caused large amounts of disk space to be used up.

We therefore changed our data structure so that we had a single DB, thus making the most efficient use of the available storage. There is no performance hit for doing this because the files are split out, unlike MySQL which uses a single file per table.

 

 

MongoDB的文件存储是以“database”为颗粒的,不像MySQL为每个table使用一个单独的文件。并且避免生成硬盘碎片,mongonDB是预申请硬盘空间,以指数递增,所以如果数据组织不好的话,会导致文件中实际使用空间远小于占用硬盘的空间,所以David更改了数据组织结构以更高效得利用空间。

 

Unexpected locking and blocking

写道
Unexpected locking and blocking

In MongoDB, removing rows locks and blocks the entire database. Adding indexes also does the same. When we imported our data, this was causing problems because large data sets were causing the locks to exist for some time until the indexing had completed. This is a not a problem when you first create the “collection” (tables in MySQL) because there are only a few (or no) rows, but creating indexes later will cause problems.

Previously in MySQL we would delete rows by using a wide ranging WHERE clause, for example to delete rows by date range or server ID. Now in MongoDB we have to loop through all the rows and delete them individually. This is slower, but it prevents the locking issue.

  

 

 在MongonDB中,删除rows需要阻塞整个database,增加index也一样,相对Mysql来说,速度慢了,但防止出现关于锁的问题。

 

Corruption

写道
Corruption

In MySQL if a database (more likely a few tables) become corrupt, you can repair them individually. In MongoDB, you have to repair on a database level. There is a command to do this but it reads all the data and re-writes it to a new set of files. This means all data is checked and means you will probably have some disk space freed up as files are compacted but it also means the entire database is locked and blocked during the time it takes. With our database being around 60GB, this operation takes several hours.

 

mysql中各类table可以独立的修复,而mongonDB的修复是database级别的,所有的data都会被检查。

 

写道
Performance

Our reasons for moving to MongoDB were not performance, however it has turned out that in many cases, query times are significantly faster than with MySQL. This is because MongoDB stores as much data in RAM as possible and so it becomes as fast as using something like memcached for the cached data. Even non-cached data is very fast.


 

 

选择MongonDB不是因为性能问题,但MongoDB的查询性能也还快,类似有个memcached缓存了数据一样。

 

另外,

    MongonDB不支持事务。

    适合写完后马上读操作。

    删除记录的时候不清理空间,只标记“删除”,以后可重复利用。

   

 

看完后,感觉MongoDB相对Mysql来说,只能说各有优略吧。

 

 

Comments(提取了一些个人觉得有价值的问题):

 

问:为什么不选择CouchDB?

答:MongonDB的查询与SQL很类似,CouchDB的KEY/VALUE查询形式相比复杂,并且mongoDB提供php模块。

 

问:为什么不考虑memcache&hadoop?

答:map/reduce查询并不是我们需要的。

 

问:为什么不考虑SenSage or Vertica?

答:对于一个新兴公司来说,商业产品成本太高。

 

问:你需要一个什么样的数据复制,有多少节点需要拷贝?Keyspace产品 适合你么?

答:两个都是新的产品,我们觉得mongoDB更成熟,另外提供PHP的模块是一大优势。

 

问:你有考虑过阻塞对应用的影响吗?

答:是的,阻塞会导致应用一直等待最终超时。

 

问:为什么不考虑TC/TT?

答:一时没有找到可工作的libs,TC/TT不是设计为了复杂查询,仅仅是KV数据库。

 

问:Hi, did you try other mysql engines besides Myisam before moving to Mongodb?

答:MyISAM was the most suitable for the type of usage we were exeperiencing – many reads and few rights. We used InnoDB (and still do) for the billing and customer systems where we need transactions.

 

 

希望对大家使用MongoDB有所帮助:)

分享到:
评论
1 楼 zhxing 2010-08-27  
引用
看完后,感觉MongoDB相对Mysql来说,只能说各有优略吧。


and  ···

相关推荐

    MySQL与MongoDB数据库架构介绍.pptx

    MySQL 与 MongoDB 数据库架构介绍 MySQL 数据库架构介绍 MySQL 是由 Oracle 公司开发、发布和支持的受欢迎的开源关系数据库管理系统(RDBMS)。MySQL 将数据存储在表中,并使用结构化查询语句(SQL)来进行数据库...

    一种将oracle数据库内的数据导入到mongodb数据库的方法及系统.docx

    4. **数据转换**: 数据从Oracle的表格形式转换为MongoDB的BSON格式,这一过程涉及到数据类型的映射和转换,例如将Oracle的表格字段转换为MongoDB的文档结构。 5. **主节点查找**: MongoDB采用分布式架构,有主从...

    MysqlToMongoDb:一个用于将数据从mysql迁移到mongodb的简单工具,用于Laravel

    MySQL到MongoDb 我开始学习mongodb时就做了这个工具,但找不到任何合适的替代方法。 该工具按预期工作,甚至在使用mysql的实时工作应用程序上进行了测试,但是我强烈建议您在使用此软件包时要格外注意。安装composer...

    MongoDB数据库-四书五经-孟子

    MongoDB数据库-四书五经-孟子,导入即可使用 MongoDB数据库-四书五经-孟子,导入即可使用 MongoDB数据库-四书五经-孟子,导入即可使用 MongoDB数据库-四书五经-孟子,导入即可使用 MongoDB数据库-四书五经-孟子,...

    记一次MongoDB性能问题(从MySQL迁移到MongoDB)

    总的来说,从MySQL迁移到MongoDB时遇到的性能问题可能涉及硬件配置、数据导入策略、操作系统特性以及数据库的内部行为。确保正确配置MongoDB以适应NUMA环境,优化数据导入过程,监控系统资源,并了解数据库的内部...

    MongoDB数据库.pdf

    MongoDB数据库.pdf学习资料复习资料教学资源 本文将对MongoDB数据库进行详细的介绍,主要包括MongoDB与SQL...本文对MongoDB数据库的介绍到这里结束,希望通过本文的学习,读者可以对MongoDB数据库有一个更深入的了解。

    课时8:MongoDB数据库安全机制.mp4

    MongoDB数据库

    koa 分别 连接 mysql、mongodb数据库操作.zip

    mongoDB是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。它介于关系数据库和非关系数据库之间,被认为是非关系数据库当中功能最丰富,最像关系数据库的...

    MongoDB数据库文件-名言警句集合,导入即可使用

    MongoDB数据库文件-名言警句集合,导入即可使用 MongoDB数据库文件-名言警句集合,导入即可使用 MongoDB数据库文件-名言警句集合,导入即可使用 MongoDB数据库文件-名言警句集合,导入即可使用 MongoDB数据库文件-...

    MongoDB 数据库-四书五经-中庸,导入直接使用

    MongoDB 数据库-四书五经-中庸,导入直接使用 MongoDB 数据库-四书五经-中庸,导入直接使用 MongoDB 数据库-四书五经-中庸,导入直接使用 MongoDB 数据库-四书五经-中庸,导入直接使用 MongoDB 数据库-四书五经-中庸...

    MongoDB数据库设计规范.docx

    "MongoDB 数据库设计规范" MongoDB 数据库设计规范是 MongoDB 数据库的设计和实现的重要指南。该规范旨在提供一个全面的 MongoDB 数据库设计指南,涵盖了 MongoDB 的核心优势、BSON 的优化、架构设计、适用场景、...

    MongoDB数据库管理工具

    1. 连接管理:MongoVUE可以连接到本地或远程的MongoDB服务器,支持多实例管理,方便切换不同的数据库环境。 2. 数据浏览:提供可视化界面展示数据库中的集合和文档,便于查看和理解数据结构。 3. 文档操作:支持...

    Python中MySQL数据迁移到MongoDB脚本的方法

    5. **数据迁移**:通过`query`方法从MySQL中选取特定范围的数据,然后使用`insert_many`方法将这些数据批量插入到MongoDB的相应集合中。 6. **进度更新**:脚本中使用`for`循环迭代数据,每处理完一批数据就更新...

    mongodb数据库以及可视化客户端软件

    MongoDB是一种分布式文档型数据库,它以其灵活性、高性能和易扩展性在现代应用程序开发中备受青睐。本资源包包括MongoDB数据库的安装包和一款可视化客户端软件,这将帮助用户更方便地管理和操作MongoDB数据库。 ...

    FineReport如何连接和使用MongoDB数据库

    随着NoSQL数据库越来越流行,MongoDB数据库作为NoSQL数据库中的领头羊,使用也越来越广泛。为此,FineReport V8.0版本提供了数据连接和数据集接口,可以通过开发一款可以连接和使用的MongoDB数据库的插件。

    mongoDB数据库WEB远程维护管理软件

    "MongoDB数据库WEB远程维护管理软件"是专为MongoDB设计的一款基于Web界面的管理工具,允许用户通过网络远程对MongoDB数据库进行操作和维护,极大地提高了数据库管理的便捷性和效率。 在数据库管理领域,可视化工具...

    mongodb数据库管理工具

    3. **数据导入导出**:支持将数据从CSV、JSON等格式导入到MongoDB,也可以将数据导出为这些格式,方便数据迁移和备份。 4. **文档编辑与创建**:允许用户直接在界面上创建、编辑和删除MongoDB文档,无需编写插入或...

Global site tag (gtag.js) - Google Analytics