MongoDB学习笔记

一,MongoDB学习笔记系列博客


二,什么是MongoDB ?

这里写图片描述
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
这里写图片描述

MongoDB命令行shell是一个基于JavaScript的工具,用于管理数据库和操作数据。MongoDB shell的功能和MySQL shell差不多,主要的区别在于不使用sql,大多数命令使用的使JavaScript表达式。

MongoDB官网:https://www.mongodb.com/
MongoDB官方教程:https://docs.mongodb.com/tutorials/
MongoDB中文社区:http://www.mongoing.com/
MongoDB官方文档:https://docs.mongodb.com/manual/
中文社区对官方文档的翻译(以如觉有异常,以官方英文版文档为准):http://docs.mongoing.com/manual-zh/index.html


三,MongoDB适合哪些业务

当前各行业都离不开数据的存储与检索要求,传统关系数据库发展了这么多年,在有些垄断性行业如电信、银行等仍然是首选,因为这些行业需要数据的高度一致性,只有支持事务的数据库才能满足它们的要求。但随着这几年互联网业务的发展,数据量越来越大,并发请求也越来越高,一个大系统中只用一种数据库并不能很好地满足全部业务的发展。同时以MongoDB为代表的NoSQL数据库快速发展,在某些方面展示了它们的优越性,逐渐被采用并取代了系统中的某些部件,总的来说以下几个方面比较适合使用MongoDB这类数据库。

1,Web应用程序

Web应用是一种基于B/S模式的程序,业务的特点是读写请求都比较高,早起系统的数据量可能很好,但是发展到一定程度后数据量会暴增,这就需要数据存储架构能适应业务的扩展。传统的关系数据库表结构都是固定的,增加一个业务或者横向扩展数据库都会带来巨大的工作量。MongoDB支持无固定结构的表模型,因此很容易增加或减少表中的字段,适应业务的变化;同时MongoDB本身就支持分片集群,很容易实现水平扩展,将数据分散到集群中的各个片上,提高了系统的存储容量和读写吞吐量。Web应用程序还有一个特点就是“热数据”读并发高,也就是说最新的数据被请求的次数最多。为了提供读的性能,在传统的关系数据中会采用其他的缓存技术来讲这部分数据放在内存中,而MongoDB本身就支持这一点,它是通过内存映射数据文件来实现的。它会维护一个工作集,将最热的数据放在内存中,不需要其他技术的协助,这为系统开发提供了简便性。

2,缓存系统

这种使用场景是与关系数据库搭配使用,作为关系数据库的缓存前端。目前缓存技术很多种,常见的就是使用memcached,但是这些缓存系统都有个缺点,就是支持的数据类型有限,查询语句也有限,只能保存少量的数据,而MongoDB这些都能支持,因此可以作为缓存使用。

3,日志分析系统

这些系统的特点是数据量大,允许部分数据丢失,不会影响整个系统的可靠性。以前将日志直接保存到操作系统的文件上,我们需要用其他工具打开日志或编写工具读日志进行分析,这样的话对大量的日志查询会比较困难。如果用MongoDB数据库来保存这写日志,一来可以利用分片集群是日志系统的容量海量大,二来使用MongoDB特有的查询语句能够快速找到某条日志记录。最重要的是MongoDB支持聚集分析甚至MapReduce的能力,为大数据的分析和决策提供了强有力的支持。

MongoDB支持当前所有主流编程语言的客户端驱动,使用方便,应用广泛,非常适合文档管理系统的应用、移动APP应用、游戏开发、电子商务应用、分析决策系统、归纳和日志系统等应用。

国内公司关于MongoDB的使用:
MongoDB在58同城百亿量级数据下的应用实践
专访黄翀:东方航空到底用MongoDB做了什么,技术选型为何花落MongoDB?


四,MongoDB入门

关于MongoDB的介绍、安装、增删改查、管道等入门网资料上有很多,这里就不再累述,,例如菜鸟教程 MongoDB教程,或者本人的系列学习笔记。

关于锁机制
没有完整事务支持,操作原子性只到单个 document 级别,所以通常操作粒度比较小。

在 2.2 版本以前,MongoDB只有全局锁;在 2.2 版本开始,大部分读写操作只锁一个库,相对之前版本,这个粒度已经下降,例如如果一个 mongod 实例上有 5 个库,如果只对一个库中的一个集合执行写操作,那么在写操作过程中,这个库被锁;而其它 5 个库不影响。
最新版本的MongoDB使用WiredTiger作为存储引擎,WiredTiger可以实现文档锁。

关于MongoDB的并发问题
官方文档的介绍:https://docs.mongodb.com/manual/faq/concurrency/
其中,关于并发问题的描述

For WiredTiger
Beginning with version 3.0, MongoDB ships with the WiredTiger storage engine.
For most read and write operations, WiredTiger uses optimistic concurrency control. WiredTiger uses only intent locks at the global, database and collection levels. When the storage engine detects conflicts between two operations, one will incur a write conflict causing MongoDB to transparently retry that operation.
Some global operations, typically short lived operations involving multiple databases, still require a global “instance-wide” lock. Some other operations, such as dropping a collection, still require an exclusive database lock.

关于写入安全机制
写入安全(write concern)是一种客户端设置,用于控制写入的安全级别。默认情况下,插入、删除和更新都会一直等待数据库响应(写入是否成功),然后才会继续执行。通常,遇到错误时,客户端会抛出一个异常。
有一些选项可以用于精确控制需要应用程序等待的内容。两种最基本的写入安全机制是应答式写入(acknowledged write)和非应答式写入(unacknowledged write)。应答式写入是默认的方式:数据库会给出响应,告诉你写入操作是否成功执行。非应答式写入不返回任何响应,所以无法知道吸入是否成功。
通常来说,应用程序应该使用应答式写入。但是,对于一些不是特别重要的数据(比如日志或者批量加载数据),你可能不愿意为了自己不关心的数据而等待数据库响应。在这种情况下,可以使用非应答式写入。
shell与客户端程序对非应答式写入的实际支持并不一样:shell在执行非应答式写入后,会检查最后一个操作是否成功,然后才会向用户输出提示信息。因此,如果在集合上执行了一系列无效操作,最后又执行了一个有效操作,shell并不会提示有错误发送。


五,查询优化

查询优化的目的就是找出慢的查询语句,分析慢的原因,然后优化此查询语句。

MongoDB对于超过100ms的查询语句,会自动地输出到日志文件里面,因此找出慢查询的第一步是查看MongoDB的日志文件,如果觉得这100ms阈值过大,我们可以通过mongod的服务启动选项slowms来设置,它的默认值是100ms。

用上面的方法找出慢查询可能比较粗糙,第二种定位慢查询的方法是打开数据库的监视功能,它默认是关闭的,我们可以通过下面的命令打开。

db.setProfilingLevel(level,[ slowms ])

参数level是监视级别,值为0表示关闭数据库的监视功能,为1表示只记录慢查询,为2表示记录所有的操作;slowms为可选参数,设定慢查询的阈值。

所有监视的结果都将保存到一个特殊的集合 system.profile 中。

通过上面的两种方法我们可以找出慢查询的语句,然后通过建立相应的索引基本可以解决绝大部分的问题。但是我们有时候需要更加精细的优化代码,这就需要分析这些慢查询的执行计划,查看查询是否用到索引,是否与我们想要的执行计划相同,用MongoDB的explain命令可以查看执行计划。
例如

db.getCollection('test').find({"name" : "test"}).explain("executionStats")

其中查询方式stage常见的有以下几种

  • COLLSCAN:全表扫描
  • IXSCAN:索引扫描
  • FETCH:根据索引去检索指定document
  • SHARD_MERGE:将各个分片返回数据进行merge

官方文档对于explain的使用
https://docs.mongodb.com/manual/reference/method/db.collection.explain/index.html
对于explain 结果的分析
https://docs.mongodb.com/manual/reference/explain-results/#explain.queryPlanner

官网中对查询性能优化的建议:
https://docs.mongodb.com/manual/core/query-optimization/
https://docs.mongodb.com/manual/core/aggregation-pipeline-optimization/#projection-optimization


六,参考资料

菜鸟教程 MongoDB
《大数据存储 MongoDB实战指南》
《MongoDB权威指南》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值