[权威指南]学习笔记——第5章 索引

for(i=0;i<100000;i++){
     db.users.insert( {"i":i, "username":"user"+i, "age":Math.floor(Math.random()*120), "created":new Date()} );
}
explain()函数查看MongoDB在执行查询的过程中所做的事情,执行计划

建立索引db.users.ensureIndex({username:1})
db.currentOp()或者检查mongod的日志来查看索引创建的进度
建立复合索引db.users.ensureIndex({age:1,username:1})
三种主要方式会使用到复合索引
    1、点查询, db.users.find({"age":21}).sort({"username":-1}),非常高校,定位到正确年龄且不需要结果排序
    2、多值查询 ,db.users.find({"age":{"$gte":21,"$lte":30}})
    3、多值查询,db.users.find({"age":{"$gte":21,"$lte":30}}).sort({"username":1}),需要在内存中先对结果进行排序,然后再返回。如果结果集大于32mb,mongod就会出错,所以不需要对数据进行排序,可以将排序键放在第一位并限定查询结果,如limit(1000)
    Hint强制mongodb使用某个特定的索引。
    索引本质上是树,最小的值在最左边的叶子上,如果程序需要使用最近数据机会多,mongodb只需在内存中保留这棵树最右侧的分支。类似这样的索引是右平衡的。

复合索引
1、选择键的方向,基于多个查询条件进行排序,方向才是比较重要的
2、使用覆盖索引,只查询索引中包含的字段,但是数组做索引则永远无法覆盖查询
3、隐式索引,只使用索引前缀的查询才能受益

$操作符如何使用索引
1、低效率的操作符
    $where
    $exists ,不存在的字段和null字段的存储方式是一样的,需遍历每一个文档检查这个值是否真的为null
    $ne,如果不等于的结果非常多,不得不扫描整个索引
    $not,大多数会退化为进行全表扫描
    $nin,总是进行全部扫描
2、范围
    先使用第一个索引键进行精确匹配,再使用第二个索引范围在结果集内部进行搜索
3、OR查询
    or实际上是执行两次查询然后将结果集合并,所以尽可能使用$in而不是$or

索引对象和数组
1、索引嵌套文档,可以对嵌套文档本身建立索引,也可以对嵌套文档的某个字段建立索引,对整个子文档建立索引,只会提高整个子文档的查询速度,无法对文档的某个字段的查询使用索引
2、索引数组,对数组建立索引,实际上是对数组的每一个元素建立一个索引条目,所以代价比单值索引高:对于单次插入、删除或者更新
3、多键索引

索引基数

====================
使用explain()和hint()

explain()放在最后,db.users.find({"age":42}).explain();
hint()强制使用某个索引
查询优化器,如果一个索引能够精确匹配一个查询,那么查询优化器就会使用这个索引,可能会有多个索引适合你的查询。mongodb会从这些可能的索引子集中为每次查询计划选择一个,这些查询计划是并行执行的,最早返回100个结果的就是胜者,其他的查询计划就会被中止。并查询计划会被缓存,知道集合数据发生了比较大的变动

=====================
何时不应该使用索引
结果集在原集合中所占的比例越大,索引的速度就越慢
{"natural":1}强制数据库做全表扫描:返回的结果按照磁盘上的顺序排列的

=====================
一、索引类型
唯一索引{"unique":true}
db.users.ensureIndex({"username":1},{"unique":true})
对于唯一索引,null的值也只能插入一个
索引储桶的大小是有限制的,索引条目不能超出限制,所有的字段都必须小于1024字节才能包含到索引里,超出8kb大小的键不会受到唯一索引的越俗:可以插入多个同样的8kb长的字符串
1、复合唯一索引
GirdFS是MongoDB中存储大文件的标准方式{"files_id":1,"n":1}
2、去除重复
创建索引时使用“dropDups”选项,如果遇到重复的值,第一个会被保留,之后的重复文档会被删除。
 db.users.ensureIndex({"username":1},{"unique":true,"dropDups":true})

二、稀疏索引——sparse选项就可以
unique和sparse组合使用,就可以使用在存在null的字段上了
sparse也可以单独使用,对于大多数有x字段,有些没有的情况,用db.foo.find({"x":{"$ne":2}})如果有稀疏索引,则不返回没有x字段的文档,如果需要的话,可以用hint()强制全表扫描

====================
索引管理
所有的数据库索引信息都存储在system.indexs集合中。这是保留集合,不能插入或者删除文档,只能通过ensureIndex或者dropIndexes对其进行操作。
可以执行db.collectionName.getIndexes()来查看给定集合上的所有索引信息
一、标识索引
Keyname1_dir1_keyname2_dir2_……_keynameN_dirN,长度有限制,可以自定义索引名称,调用getLastError可以知道索引是否成功创建或者失败的原因
二、修改索引
dropIndex命令删除不再需要的索引 de.people.dropIndex("x_1_y_1"),用name来指定需要删除的索引

background选项可以指定,如果有新的数据库请求需要处理,创建索引的过程就会暂停一下
在已有的文档上创建索引会比新创建索引再插入文档快一点。

时间: 2024-08-10 19:18:45

[权威指南]学习笔记——第5章 索引的相关文章

css权威指南学习笔记--第七章

由于之前一直没有系统的看过css相关的书籍,导致自己css方面一直都是处于零散状态.知其然,不知其所以然.所以买了<css权威指南>.虽然比较老了,但是应该也会收获很大. 1 水平方向上 margin-left +border-left+padding-left+width+padding-right+border-right+margin-right 其中红色的是可以设置为auto,当设置为auto时,浏览器会自动计算该值.基于的原则就是 外层包裹容器的width=被包裹元素的width+p

css权威指南学习笔记--第6章

line-height:定义文本行基线之间的距离 <p style="line-height: 20px;"> these are test words<br /> these are test words </p> 说到line-height就不能不说到行框中各个高度是怎么计算的,这里引用css权威指南中的图 文本行中的每个元素都会生成一个内容区,这由字体的大小确定.如果不存在其他因素(如line-height)那么这个内容区的高度就是行内框的高度

[权威指南]学习笔记——第6章 特殊的索引和集合

固定集合,大小固定的集合,其行为类似于循环队列,在碟式磁盘上的写入速度非常快.固定集合不能被分片,可以用于记录日志.一.创建固定集合createCollection函数db.createCollection("my_collection",{"capped":true,"size":100000,"max":100})必须指定大小,可以知道数量.固定集合创建之后,就不能改变了也可以通过convertToCapped命令实现某个

Git权威指南学习笔记(二)Git暂存区

如下图所示: 左侧为工作区,是我们的工作目录. 右侧为版本库,其中: index标记的是暂存区(stage),所处目录为.git/index,记录了文件的状态和变更信息. master标记的是master分支所代表的目录树.HEAD指向master分支. objects标记的是Git的对象库,所处目录为.git/objects,文件索引建立了文件和对象库中对象实体之间的映射关系. 通过该图我们可以清晰地看出add,commit等命令的转化关系.下面通过git diff和git status两条命

JavaScript权威指南学习笔记之一

1.关于分号 javascript里面不强制使用分号来表示一行语句的结束,但是最好能够在写js之前,特别是在原有的js上面新增时,最好前置一个分号.避免这种情况发生:  2.JavaScript类型转换 3.关于=== ①如果类型不同则不等 ②null===null或undefined===undefined ③true===true或false===false ④NaN不等 ⑤0===0 0===-0 ⑥如果是同一个object,array,function则相等 4.关于== ①如果已经==

MongoDB权威指南学习笔记4---查询相关的知识点

1 find find({查询条件},{"key":1,"email":1})  后面表示返回哪些键 2 可用的比较操作符 $lt , $lte,$gt,$gte 比如db.users.find({"age":{"$gte":18,"$lte":30}}) 3不等于 find(...{"key":{"$ne":"value"}} 4 in find

MongoDB权威指南学习笔记5---索引相关的知识点

1 查看查询计划 db.user.find({"username":"xxx"}) .explain() db.doc.find({"es_y":"2014"}).explain() {  "cursor" : "BasicCursor",  "isMultiKey" : false,  "n" : 0,  "nscannedObject

Git权威指南学习笔记(一)Git初始化

1.在Git中配置用户名和邮件地址 $ git config --global user.name "Jymn_Chen" $ git config --global user.email "[email protected]" 注意把用户名和邮件地址替换成你自己的资料. 在这里的参数global表示配置的作用范围是当前用户,如果将参数改为system,那么配置的作用范围是系统中的所有用户. 2.创建版本库 新建一个目录并cd到目录中,执行以下命令: $ git i

Hadoop权威指南学习笔记一

Hadoop权威指南学习笔记一 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习参考,有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.net/my_acm 1. 数据的增长远远超过了磁盘的读取速度,传统的数据存储方式和分析方式变得不再适用于大数据的处理. Hadoop分为两大核心技术,HDFS(HadoopDistributed File System-分布式hadoop文件处理系统)和MapReduce(分为Map-数据映射等