vlambda博客
学习文章列表

【数据库】mongodb和mysql的对比

昨天又想起一个事情,就是之前的部门把mysql换mongo了,为什么要换呢?之前有想过,但是没做总结,今天趁着上班没事做就总结了一下。
mysql: 关系型数据库

把数据存储在纵横结构的表中,使用结构化查询语句(sql)访问数据

可以预先定义数据库模式(也就是存储数据的结构, 表结构之类的),可以设定规则管理表字段的间的关系(关联)

数据被存在单独的表里,不同表之间通过关联查询来关联,使数据重复量最小化

mongo: 非关系型数据库

把数据存在类似JSON(KV键值对的形式)的文档中(数据在存储的时候MongoDB数据库为文档增加了序列化的操作,最终存进磁盘的其实是一种叫做BSON的格式,即Binary - JSON)

每个文档的json结构可能不一样,使用mongo查询语言访问数据

可以很直观的表现层级关系,例如一个学生记录,MySQL则不能很好地表现这种层级关系,如果需要表现学科和成绩之间的层级关系,可以用多张表,但是数据库内容更加复杂了

"_id""1002","score": { "Maths": 81, "Chemistry": 74, "Sport": { "Basketball": 67, "Badminton": 76, }}

mongo使用动态模式(就是不用定义结构,就可以创建记录,添加删除字段),数据是非规范化的

支持高可用和可扩展


MySQL
MongoDB

集合



字段
joins 
嵌入文档或者链接

两者都有索引,都有主键,mongo会自动生成一个随机生成的值作为主键值(假如没指定主键的话)


市场上选择mongodb的原因

①可以快速地构建程序,处理多样化的数据(文档不需要规范化,面轻松应对数据属性多样性),可以把文档自然映射到面向对象变成语言,

避免将代码中的对象转换为关系表的复杂对象关系映射层(也就是不需要建model层,把表和对象映射)

②(灵活数据模型,自由增删字段)数据库模式可以随业务发展(这里其实和第一点是一样的),(但是也为不清楚数据库里的数据格式的运维人员带来了麻烦)

③可以在分布式数据中心中扩展,实现高可用,可扩展,mysql需要大量的定制工程。

MongoDB官方就自带一个分布式文件系统,可以很方便地部署到服务器机群上。MongoDB里有一个Shard的概念,就是方便为了服务器分片使用的。

每增加一台Shard,MongoDB的插入性能也会以接近倍数的方式增长,磁盘容量也可以很方便地扩充。

MongoDB还自带了对map-reduce运算框架的支持,这也很方便进行数据的统计。


什么时候用mysql,什么时候用mongo

①mongo不支持事务,需要复杂的多行事务,例如支付结账系统这种场景mysql关系型数据库更适合

②mongo的灵活数据模型适合提供内容,社交网络之类的,例如商品属性,评论等等


mongo和mysql一起用

也就是上面所说的,跟用户打交道的,产品属性用mongo,交易使用mysql,充分利用两者的特点。(电商平台可以用)


sql和nosql两者之间并不是为了谁替换谁,两者是不同的数据库设计思路,为了不同的需求而诞生


在游戏里使用mysql和mongo哪个好?

mongo更好,游戏的数据模型灵活,不需要mysql的结构化,也不需要关联别的表,对字段的类型也没有强烈的要求,之前用MySQL的时候都是用json存每个字段的值,字段内可以自由扩展

游戏也不需要事务

之前用mysql是因为工具成熟,通过hibernate(orm框架)就可以完成建表和增加字段,以及对象和表的映射。