什么是MongoDB数据库?
MongoDB是一个开源、高性能、支持海里数据存储的文档型数据库。
MongoDB是一个高效的非关系型数据库(不支持表关系:只能操作单表)
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
MongoDB是NoSQL数据库产品中的一种,其存储类型和MySQL比较像,也可以通过某个字段来进行查询;所以也有人说它是最像关系型数据库(MySQL)的非关系型数据库。
MongoDB数据库有什么特点?
数据存储方式:内存+磁盘
高扩展性:借助内置数据分片来实现
特点一:数据存储的方式—内存+磁盘
客户端和MongoDB进行数据交互,MongoDB中又包括两部分,内存和磁盘;
对于查询来说,客户端首先进行数据操作是对内存进行操作,会先去内存中进行查找,所以查询的速度是很快的;如果内存足够大的话,就直接可以去内存中查询,避免和磁盘进行交互;如果内存不足,还需去磁盘中查找数据。
对于保存来说,客户端进行数据操作直接保存在内存中,直接操作的是内存所以保存的速度也是比较快的,效率高。
这里就会涉及到一个问题,现在数据在内存中,一旦服务器重启或者中途断电或者宕机了,那内存数据岂不是丢失了?
对于,借助操作系统的机制,会将内存的数据自动映射到磁盘中,但是会有一个时间规则,每隔60s写入一次。
那这样就可以解决数据丢失的问题了吗?当然不是!
如果说内存中已经写入了数据, 但是还没有同步到磁盘上,这个时候突然断电了,那这60s没有同步的数据就会丢失。
这也解释了为什么MongoDB的效率比较高,因为它直接操作的是内存。同时MongoDB也有丢失数据的风险,因为它涉及到内存和磁盘的数据同步,也就是刷盘的过程。
为了解决这个问题MongoDB对结构进行优化。
结构优化
同样将MongoDB分为两个部分,内存和磁盘;但不同的是,又将内存和磁盘各划分为两个部分,一个是日志文件,一个是真正的业务数据。客户端发送请求到内存当中,首先会将操作的语句进行日志记录,然后在写入到业务数据的内存部分。那么内存中的日志会每10ms一次将记数据同步给磁盘的日志;并且内存中业务数据部分也会以每60s同步到磁盘的业务数据部分。
这样做的好处就是,缩小了数据同步时间的范围。
当内存通过日志记录写入数据后,突然宕机了,虽然内存与磁盘会丢失60s的数据;但是日志间的数据同步设置了更短时间10ms,在服务器重新启动的时候,会将磁盘的日志文件部分和业务数据部分进行比较将找出丢失的数据并进行数据恢复;
唯一不足的是,虽然同步数据时间缩短了,但还是会丢失10ms的数据。不管如何努力MongoDB都会有一段时间的数据丢失;
总的来说,MongoDB的第一个特点,将数据存储到内存+磁盘上;客户端操作的基本上都是内存,背后借助操作系统将内存的数据和磁盘进行数据同步,因此可能会导致数据丢失;由于操作的全部是内存所以读写操作效率是比较高的。
特点二:高扩展性—借助内置数据分片来实现
在我们使用MongoDB的时候往往会出现这种情况:
MongDB由于自己的硬盘存储容量有限,导致多余的数据可能就存不下去;那这个时候怎么办呢?MongoDB可以借助内置的数据分片,将多个MongoDB服务器串联在一起,每台服务器存储一部分,这样存储数据量就增多了;
比如说,现在有三台MongoDB服务器A、B、C,每台服务器可以支持500GB,那么三台串联在一起就可以存储 1.5TB数据了;
这样一来,使用MongoDB的内置数据分片可以很轻松的对海量数据进行保存。这也为MongoDB海量数据存储打下了基础。当然MySQL也支持数据分片,但是需要借助第三方服务和组件,实现成本相对较高一些。
数据存储和高扩展性这两个特点就很好的解释了MongoDB的高性能和海量存储的支持。
MongoDB的适用场景?
1.游戏行业:游戏装备数据、游戏道具数据
这些数据修改极其频繁,且数据较多。
2.物流行业:地理位置信息,海量数据
多个地理位置信息串联 出它的运动轨迹在地图上展示出来。物流行业的数据量是极多的,不间断的向数据库保存地址位置坐标信息。同时保存这些坐标信息也有很多应用场景,比如搜索附近的人
3.直播行业:直播数据、粉丝数据、打赏数据
这些数据修改频率极快,数据量也极多。
4.日志数据
在项目中一些关键的日志需要将其保存下来,其日志的数据量也是巨大的,且结构多变。
如遇到以上需求,可以将数据保存到MongoDB数据库中。