1.索引的相关介绍:
monggodb的索引也是一颗平衡二叉树,所以在传统数据库中的绝大部分的索引优化技术也是可用的.
注意:mongodb可以在任意方向上对数据进行遍历(这点和关系数据库中的索引不一样),但这个仅限于单键排序,对于多键排序索引的方向还是比较重要的.
下面是个单键排序无方向性的具体的例子:
上面是两个查询的执行计划,红色部分的参数表示,查询是否在内存中有排序操作,
从上面的例子中可以很明显的看出,无论是按照iage的降序还是升序排序,查询都没有在内存中有排序操作.
2.mongodb 中的索引类型比较多,我这里仅仅列出比较常见的索引类型,更多的索引类型,参见http://www.cnblogs.com/xinghebuluo/archive/2011/12/19/2293043.html
唯一索引:它保证跟已有文档的索引关键字重复的文档不会被插入
上面的的例子中已成功创建一个唯一索引.
复合唯一索引:多个键值组合的唯一索引。
复合唯一索引实例:
创建唯一索引的注意事项:
(1)唯一索引和不存在的关键字:
当保存到集合中的文档在索引字段没有值的话,它的索引字段会被赋值为null然后插入。就是说,你不可能在唯一索引中插入多个在某个索引字段都没有值的文档。(多个null值被认为是相等的值)
以下实例在唯一索引字段上插入多个null值报错.
(2).对已经存在的重复值的字段创建唯一索引.
如果直接创建唯一索引肯定是会报错的.
(3).如果一定要在这样的字段上创建唯一索引,可以在创建唯一索引的时候指定一个关键字dropDups来强制创建索引.但是这种创建索引的方法会删除集合中的数据,所以不建议使用这种方法。
使用dropDups强制创建索引范例:
稀疏索引:在mongdo的集合中,每个文档的键值对可以不一样(行的列数不一样),那么在一个索引中,字段可能在某个文档中,也有可能不在某个文档中,当字段不在某个文档中的时候,查询利用索引得到数据时默认情况下会将没有这个字段的文档查询出来.
以上实例中的查询,通过索引iage 得到了数据,但是将不包含iage字段的文档也查询出来了,
这个时候可以通过稀疏索引将那些没有包含索引字段的文档过滤掉.
以下是一个通过稀疏索引过滤不包含索引字段的的文档的例子:
从执行计划中可以看到,查询是通过稀疏索引得到数据的,并且查询出来的结果集中全部包含iage字段(过滤掉了没有包含iage的文档).
3.索引管理:
查看制定集合下的索引信息 :db.collection.getIndexes();
查看当前架构下的所有索引信息 :db.system.indexes.find({});
创建索引:db.collection.ensureIndex({key:1}},{unique:true,dropDups:true});
hint({}):强制使用某个键值(索引)
还可以在后台建立索引db.collection.ensureindex({someFiled:1},{background:1})
优点:定期释放锁,以便客服端写入数据.
缺点:耗时较长
前台建立索引(默认):
优点:耗时相对较少
缺点:索引创建期间客服端不能写入数据
删除索引:db.collection.dropIndexes() ,db.collection.dropIndex(index)
重建索引:db.test.reIndex()
标识索引: db.collection.ensureIndex({key:1}},{name:"Index_name"});
(1):查看指定集合的所有索引:db.colleciton.getIndexes();
(2)查看当前架构下的所有索引信息 :db.system.indexes.find({});
(3)创建索引:db.collection.ensureIndex({key:1},{unique:true,dropDups:true,sparse:true})
上面是创建索引的标准语法,第二个大括号({unique:true,dropDups:true,sparse:true})为索引类型参数。
Unique:表示唯一索引。
Sparse:表示稀疏索引.
dropDups:当索引字段中存在重复值时,强制删除重复的文档,该参数会丢失数据,不建议使用该参数.
(4)hint({}):强制使用某个键值(索引)
下面实例中,从执行计划可以看出,强制使用索引了。
(5).删除索引:db.collection.dropIndexes() ,db.collection.dropIndex(index)
db.collection.dropIndexes():删除集合下面的所有索引.
集合test下面已经没有可删除的索引,_id_ 是系统自带的索引,无法手动删除.
db.collection.dropIndex(index_name):删除指定索引
(6).当索引效率低下的时候(可能是碎片较多),就需要重建索引了。db.test.reIndex() 。
db.test.reIndex():重建索引
重建单个索引或是 集合下的所有索引。
4.执行计划解读:
正确解读一个查询的执行计划是优化查询的第一步,所以必须准确的读懂查询的执行计划:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。