项目中我为什么用Mongodb取代Mysql

   在项目设计的初期,我当时有了这样的想法,同时也是在满足下面几个条件的情况下来选择最终的nosql方案的:

  1、需求变化频繁:开发要更加敏捷,开发成本和维护成本要更低,要能够快速地更新进化,新功能要在最短的周期内上线。

  2、客户端/api支持,因为这直接影响开发效率

  3、部署简单

  4、扩展能力强

  5、节省系统资源,对cpu等资源耗费较小

  满足这些要求的nosql方案,就剩下了mongodb和redis了,对于redis,我并不是说他不好,而是有一个重要原因,我们的项目的数据处理格式都是采用JSON的形式来处理的,这一点对于后来两者之间的选择,起到了决定性作用。

  当然,Redis对丰富数据类型的操作很吸引人,可以轻松解决一些应用场景,其读写性能也相当高,之前的版本是存储和内存挂钩是挂钩的,这样如果存储大量的数据需要消耗太多的内存,当然现在的版本已经么有这样的问题了。

  MongoDB是一个面向文档的数据库,目前由10gen开发并维护,它的功能丰富,齐全,完全可以替代MySQL。

  在我项目实施的过程中,我总结了mongodb的一些很好的亮点:

  为什么MongoDB可以替代MySQL?

  1、使用JSON风格语法,易于掌握和理解:MongoDB使用JSON的变种BSON作为内部存储的格式和语法。针对MongoDB的操作都使用JSON风格语法,客户端提交或接收的数据都使用JSON形式来展现。相对于SQL来说,更加直观,容易理解和掌握。这也是根据我自己项目的情况出发,最后选择了mongodb的一个原因。

  2、Schema-less,支持嵌入子文档:MongoDB是一个Schema-free的文档数据库。一个数据库可以有多个Collection,每个Collection是Documents的集合。Collection和Document和传统数据库的Table和Row并不对等。无需事先定义Collection,随时可以创建。Collection中可以包含具有不同schema的文档记录。 这意味着,你上一条记录中的文档有3个属性,而下一条记录的文档可以有10个属性,属性的类型既可以是基本的数据类型(如数字、字符串、日期等),也可以是数组或者散列,甚至还可以是一个子文档(embed document)。这样,可以实现逆规范化(denormalizing)的数据模型,提高查询的速度。

  3、简单易用的查询方式:直接使用JSON,支持范围查询、正则表达式查询。

  4、CRUD更加简单,支持in-place update:只要定义一个数组,然后传递给MongoDB的insert/update方法就可自动插入或更新;对于更新模式,MongoDB支持一个upsert选项,即:“如果记录存在那么更新,否则插入”。MongoDB的update方法还支持Modifier,通过Modifier可实现在服务端即时更新,省去客户端和服务端的通讯。这些modifer可以让MongoDB具有和Redis、Memcached等KV类似的功能:较之MySQL,MonoDB更加简单快速。Modifier也是MongoDB可以作为对用户行为跟踪的容器。在实际中使用Modifier来将用户的交互行为快速保存到MongoDB中以便后期进行统计分析和个性化定制

  5、所有的属性类型都支持索引,甚至数组:这可以让某些任务实现起来非常的轻松。在MongoDB中,“_id”属性是主键,默认MongoDB会对_id创建一个唯一索引。

  6、性能高效,速度快: MongoDB使用c++/boost编写,在多数场合,其查询速度对比MySQL要快的多,对于CPU占用非常小。部署也很简单,对大多数系统,只需下载后二进制包解压就可以直接运行,几乎是零配置。

  7、服务端脚本和Map/Reduce:MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。MongoDB不支持事务级别的锁定,对于某些需要自定义的“原子性”操作,可以使用Server side脚本来实现,此时整个MongoDB处于锁定状态。Map/Reduce也是MongoDB中比较吸引人的特性。Map/Reduce可以对大数据量的表进行统计、分类、合并的工作,完成原先SQL的GroupBy等聚合函数的功能。并且Mapper和Reducer的定义都是用Javascript来定义服务端脚本。

时间: 2024-02-28 18:34:57

项目中我为什么用Mongodb取代Mysql的相关文章

在java项目中的mongodb的_id被fastjson转为json时竟然丢失了

fastjson是阿里开发的一个javaBean和json解析器和封装器(源码位置),用过几次感觉挺好用的,也是国人的开源项目当然得支持,但最近项目在使用mongodb作为数据库时出现了_id丢失的问题,现将我遇到的问题和解决办法展示一下. 现将错误的程序代码添加上,然后再提供解决方法: package org.jivesoftware.openfire.plugin.friends.test; import org.bson.types.ObjectId; import org.jivesof

如何把日志写入数据库-如何把日志写入mysql数据库(日志就是记录项目中的所有操作)

问题描述 如何把日志写入mysql数据库(日志就是记录项目中的所有操作) 我在mysql中建了表,字段有:操作者ID.操作者姓名.模块名称.操作类型.IP地址.MAC地址.操作时间.查询条件.日志详细内容其中 "查询条件" 指用户在系统中,如果用 "查询" 操作时输入的查询条件:IP地址.MAC地址 是用户机器使用的ip 和 mac 地址:操作类型 暂时有这么几项:使用业务功能.浏览.查询.登入.登出....搞不清的都归为 使用业务功能 ,然后在 日志详细内容 中说

java项目中,solr如何整合mongoDB

问题描述 java项目中,solr如何整合mongoDB 正在做一个java项目,这个项目使用mongoDB数据库,采用solr搜索引擎.请问如何整合这两者?

作为一名Java程序员,我为什么不在生产项目中转向Go

自Google在2009年发布Go语言的第一个正式版之后,这门语言就以出色的语言特性受到大家的追捧,尤其是在需要高并发的场景下,大家都会想到是不是该用Go.随后,在国内涌现出了一批以七牛为代表的使用Go作为主要语言的团队,而许世伟大神本人也在各种场合下极力推动Go在国内的发展,于是在这种大环境下,中国的Go开发者群体逐渐超越了其他地区. 那么问题来了,业余时间好学是一回事,真正要将一个新东西运用到生产中则是另一回事.JavaScript的开发者可以义无反顾地选择Node.js,但是对于Java开

运维专家:我在大数据项目中踩过的那些坑

一.主要讨论人员 提问:陈超,七牛云技术总监 回答:朱冠胤,百度资深大数据专家,连续两次百度最高奖得主. 二.引言 "坐而论道"是一个轮流问答的玩法.本文是大数据主题周中,几位国内一线专家激情问答的一部分内容.期间,各位群友也积极参与. 三.问题集锦 1.MongoDB在百度的使用场景及规模? 2.假设现在让你完全主导一个类似Hadoop的项目,你会选择哪种语言? 3.分享你在百度各种大数据项目中踩过的坑? 4.你所在团队在自研和使用开源方案的主要考虑因素? 5.新一代分布式数据库(N

python+django能够同时使用mongodb和mysql两种数据库引擎吗?

问题描述 python+django能够同时使用mongodb和mysql两种数据库引擎吗? 各位朋友们好,我原来做一个项目:因为表没有关联,所以用的是非关系型数据库mongodb,项目开发环境用的是python+django,部署在ubuntu上.当时用了pymongo做python和mongodb的连接,用mongoengine做了django与mongodb的连接. 现在来了新的需求,表之间有关联,因此我准备添加一个mysql数据库. 请教各位朋友们,django展示网页的时候,能够同时展

MongoDB与MySQL的操作对比表及区别介绍_MongoDB

MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方.所以我们所熟知的那些SQL(全称Structured Query Language)语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言.   以我们公司项目为例,在早期的项目中,都在使用关系型数据库,用过SQLServer,Oracle,DB2,后来全部转向Mysql,原因很简

MongoDB实现mysql主键autoincrement

MongoDB新建表默认有一个_id字段来作为autoincrement自增实现,而这个_id字段类型是objectid类型(objectid 是12字节的BSON类型).ObjectId的详细解释. 而现在因为数据库迁移,将项目中原mysql的一些locations表移植到mongodb上面.对于locations 使用mongodb 2d loc 索引能够更快的进行数据检索,同时避免原mysql需要经过复杂的经纬度查询. 那么数据迁移后主要的要求有 1.数据库表的迁移不会影响表与表之间的关系

列举一下项目中使用的产品和技术

浏览器兼容水平: IE7-10, Firefox和Chrome最新版 开发环境: Windows7+Visual Studio 2010+Oracle TortoiseSVN+Subversion 项目和Bug管理系统 禅道.--一款国内开发的项目管理和bug管理系统. http://www.zentao.net/ 生成环境: Windows Server 2008+IIS7.5+Oracle+.NET(MVC3.0) 需求分析 Enterprise Architect 90天试用版.在学校做课