MongoDB学习笔记(五、MongoDB存储引擎与索引)
目录:
- mongoDB存储引擎
 - mongoDB索引
 - 索引的属性
 - MongoDB查询优化
 
mongoDB存储引擎:
目前mongoDB的存储引擎分为三种:
1、WiredTiger存储引擎:
a、Concurrency(并发级别):WiredTiger支持文档级别的并发,支持多个客户端同时修改一个文档。
b、Snapshots and Checkpoints(快照与检查点):WiredTiger每60s创建一个检查点(将快照数据写入磁盘),在此之间mongo或服务器宕机便会丢失数据。
c、Journal(检查点中间日志):针对Checkpoint的优化,在创建检查点持久化到磁盘前的数据会先存到Journal上。
若日志空间小于128B则不压缩,大于则启用压缩算法(使用snappy算法压缩数据)。设置压缩算法: storage.wiredTiger.engineConfig.journalCompressor
d、Compression(压缩算法):以消耗CPU资源来减少储空间的消耗。默认使用分块压缩算法压缩集合的数据,snappy算法(前缀压缩)压缩索引。
设置集合压缩算法: storage.wiredTiger.collectionConfig.blockCompressor。
设置索引压缩算法: storage.wiredTiger.indexConfig.prefixCompression。
e、Memory Use(内存使用情况):
在mongo的WiredTiger引擎中有两个内存,(RAM - 1GB) * 0.5、256M;默认使用两者间大的哪一个作为mongo的使用内存。
设置MongoDB可用内存大小单位GB: storage.wiredTiger.engineConfig.cacheSizeGB
2、MMAPv1存储引擎:
a、Journal:同WiredTiger。
b、Record Storage(数据存储):数据连续的存储在磁盘上,当文档需要更大的空间时会涉及数据移动,并且还要更新索引,还会导致磁盘碎片。
c、Memory Use:使用全部内存空间
3、InMemory存储引擎:
a、Concurrency:同WiredTiger。
b、Memory Use:RAM * 0.5 - 1GB
mongoDB索引:
mongoDB的索引主要分为4种:
1、单键索引:在某一特定的属性上建立的索引。
语法:db.collectionName.createIndex({'name':-1}) -1=降序,1=升序
mongoDB的ID就建立了唯一的单键索引,在字段上精确匹配、排序及范围查找都会使用此索引。
2、复合索引:在多个特定的属性上建立的索引。
语法:db.collectionName.createIndex({'name':-1, age:1})
在字段上精确匹配、排序及范围查找都会使用此索引,但与索引的顺序有关。
为了性能考虑,应删除存在与第一个键相同的单键索引。
如:一次查询需要根据name和age查找
若只有name索引,那相同姓名较多的情况也会导致查询效率降低;你可能会说再建一个age的索引不就得嘞,当然不行,因为mongo一次查询只能使用一个索引,所以像这种情况就需要建立复合索引来提升查询效率。
那为啥要删除存在与第一个键相同的单键索引呢,上面说到一次查询只能使用一个索引,而复合索引可以使用前缀查询的方式代替单个的name索引,所以单个的name索引是一个浪费。
3、多键索引:数组上建立的索引。
语法:db.collectionName.createIndex({'address.city':1})
4、哈希索引:
语法:db.collectionName.createIndex({'name':'hashed'})
Hash索引上的入口是均匀分布的,在分片集合中非常有用。
索引的属性:

创建索引:
db.collectionName.createIndex(
{'name':1},
{
'background':true,
'unique':true,
'sparse':true
}
)
删除索引:
1、删除指定姓名:db.collectionName.dropIndex('indexName')
2、删除集合上的索引(_id删不掉):db.collectionName.dropIndexs()
3、重建集合上的索引:db.collectionName.reIndex()
4、查询集合上的索引:db.collectionName.getIndexs()
MongoDB查询优化:
1、慢查询定位
开启慢查询:db.setProfilingLevel(n, {m})
n有三个可选值:
- 0;不记录(默认值)。
 - 1;记录慢查询日志,为1是必须指定m,也就是查询时间的阀值,单位ms。
 - 2;记录所有慢查询日志。
 
MongoDB的慢查询打开后,日志会存放于system.profile的集合中,其最大分配128K的空间。
可以使用$nartual对慢查询日志排序,如:db.system.profile.find().sort({'$natural':-1}).limit(5)
2、慢查询分析
可通过查询计划explain来分析慢查询,如db.collectionName.find({'age':{'$lt':50}}).explain('executionStats')
explain可选参数:
queryPlanner;默认值,表示仅仅展示执行计划信息。
executionStats;表示展示执行计划信息同时展示被选中的执行计划的执行情况信息。
allPlansExecution;表示展示执行计划信息,并展示被选中的执行计划的执行情况信息,还展示备选的执行计划的执行情况信息。
3、关于索引的使用建议
根据需求建立索引,它有用但也有成本,不要对那些写多读少的建立索引。
尽量保证每个查询的stage都为IXSCAN,追求扫描文档数(totalDocsExamined) = 返回文档数(nReturned)。
MongoDB在一次查询只是用一个索引,如果多条件查询的尽量使用复合索引。
在数据量多的时候建立索引是非常消耗资源的,所以尽量在数据量小的时候就把索引建好。
MongoDB学习笔记(五、MongoDB存储引擎与索引)的更多相关文章
- MongoDB 学习笔记之 检测存储引擎
		
检测存储引擎: db.serverStatus().storageEngine db.serverStatus().wiredTiger (转)WiredTiger测试结果 单纯写的测试结果 结论:W ...
 - MongoDB学习笔记(五) MongoDB文件存取操作
		
由于MongoDB的文档结构为BJSON格式(BJSON全称:Binary JSON),而BJSON格式本身就支持保存二进制格式的数据,因此可以把文件的二进制格式的数据直接保存到MongoDB的文档结 ...
 - Mongodb学习笔记一(Mongodb环境配置)
		
Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...
 - MongoDB学习笔记(一) MongoDB介绍及安装(摘)
		
MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式.Mongo使用C++开发.Mongo的官方网 ...
 - MongoDB学习笔记一(MongoDB介绍 + 基本指令 + 查询语句)
		
什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供可扩 ...
 - MongoDb 学习笔记(一) --- MongoDb 数据库介绍、安装、使用
		
1.数据库和文件的主要区别 . 数据库有数据库表.行和列的概念,让我们存储操作数据更方便 . 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功能 ...
 - MySQL学习笔记七:存储引擎
		
1.MySQL存储引擎的设计采用“插件式”方案,用户可以很方便地选择使用哪种存储引擎,想使用mysql没有提供的引擎时,可以自己安装进去. 查看支持的存储引擎 mysql> show engin ...
 - Mongodb学习笔记二(Mongodb基本命令)
		
第二章 基本命令 一.Mongodb命令 说明:Mongodb命令是区分大小写的,使用的命名规则是驼峰命名法. 对于database和collection无需主动创建,在插入数据时,如果databas ...
 - MySQL学习笔记(四):存储引擎的选择
		
一:几种常用存储引擎汇总表 二:如何选择 一句话:除非需要InnoDB 不具备的特性,并且没有其他办法替代,否则都应该优先考虑InnoDB:或者,不需要InnoDB的特性,并且其他的引擎更加合适当前情 ...
 - MySQL学习笔记:Engine存储引擎
		
在使用Mysql建表过程中,有时候会遇到一些奇怪的现象.例如,如何插入数据就是查询不到数据,此时可能是建表的存储引擎设置成为engine=blackhole的原因. 1.engine=innodb 提 ...
 
随机推荐
- ARTS-S golang goroutines and channels(一)
			
先用golang实现一个简单的tcp服务端,假定文件名为clock1.go // clock1.go package main import ( "fmt" "io&qu ...
 - Asp.net Core 异常日志与API返回值处理
			
需求: 1.对异常进行捕获记录日志 并且修改返回值给前端 解释: ILogger4是自定义的一个日志,更改它就好 解决方案1: 使用中间件进行异常捕获并且修改其返回值 public class Err ...
 - 【CuteJavaScript】Angular6入门项目(1.构建项目和创建路由)
			
本文目录 一.项目起步 二.编写路由组件 三.编写页面组件 1.编写单一组件 2.模拟数据 3.编写主从组件 四.编写服务 1.为什么需要服务 2.编写服务 五.引入RxJS 1.关于RxJS 2.引 ...
 - 【Java Web开发学习】Spring环境profile
			
[Java Web开发学习]Spring 环境profile 转载:http://www.cnblogs.com/yangchongxing/p/8890702.html 开发.测试.生产环境往往是不 ...
 - 一个非常美的FlutterUI组件扩展集:FLUI
			
项目地址 FLUI 官网 下载 Demo APK 体验 这是一个群内的网友写的,感觉里面的组件风格非常美,封装的挺到位的,在此推荐给大家,具体可以参考学习. 可以学到的知识还是挺多的,组件UI封装可以 ...
 - JSON在线解析及格式化校验工具 jsonin.com
			
JSON在线解析及格式化校验工具 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.它是基 ...
 - Bootstrap模板-Amaretti.2.6.2
			
密罐地址: 点我下载
 - Leetcode题解 - 贪心算法部分简单题目代码+思路(860、944、1005、1029、1046、1217、1221)
			
leetcode真的是一个学习阅读理解的好地方 860. 柠檬水找零 """ 因为用户支付的只会有5.10.20 对于10元的用户必须找一个5 对于20元的用户可以找(三 ...
 - SpringBoot微服务电商项目开发实战 --- Kafka集成接入
			
kafka作为消息中间件的一款产品,她比较轻量级,在吞吐量方面很优秀,默认消息持久化到硬盘当中 168小时=7天,log.retention.hours=168,比较适合来做运营的统计.其他的不多讲, ...
 - Ansible自动化部署入门到进阶笔记
			
目录 一.基本部署 安装Ansible Ansible配置文件 定义Inventory 使用秘钥方式连接 使用帮助 Ansible命令应用基础 二.常见模块 三.Ansible playbook 四. ...