mongodb 索引相关
admin
2023-04-12 09:04:10
0

1.索引的相关介绍:

monggodb的索引也是一颗平衡二叉树,所以在传统数据库中的绝大部分的索引优化技术也是可用的.

注意:mongodb可以在任意方向上对数据进行遍历(这点和关系数据库中的索引不一样),但这个仅限于单键排序,对于多键排序索引的方向还是比较重要的.

下面是个单键排序无方向性的具体的例子:

mongodb 索引相关

 

上面是两个查询的执行计划,红色部分的参数表示,查询是否在内存中有排序操作,

从上面的例子中可以很明显的看出,无论是按照iage的降序还是升序排序,查询都没有在内存中有排序操作.

 

2.mongodb 中的索引类型比较多,我这里仅仅列出比较常见的索引类型,更多的索引类型,参见http://www.cnblogs.com/xinghebuluo/archive/2011/12/19/2293043.html

 

唯一索引:它保证跟已有文档的索引关键字重复的文档不会被插入

mongodb 索引相关

 

上面的的例子中已成功创建一个唯一索引.

 

 

复合唯一索引:多个键值组合的唯一索引。

复合唯一索引实例:

mongodb 索引相关

 

创建唯一索引的注意事项:

(1)唯一索引和不存在的关键字

当保存到集合中的文档在索引字段没有值的话,它的索引字段会被赋值为null然后插入。就是说,你不可能在唯一索引中插入多个在某个索引字段都没有值的文档。(多个null值被认为是相等的值)

以下实例在唯一索引字段上插入多个null值报错.

 mongodb 索引相关


 

(2).对已经存在的重复值的字段创建唯一索引.

   如果直接创建唯一索引肯定是会报错的.

mongodb 索引相关

 

(3).如果一定要在这样的字段上创建唯一索引,可以在创建唯一索引的时候指定一个关键字dropDups来强制创建索引.但是这种创建索引的方法会删除集合中的数据,所以不建议使用这种方法。

 

使用dropDups强制创建索引范例:

mongodb 索引相关

 

 

稀疏索引:mongdo的集合中,每个文档的键值对可以不一样(行的列数不一样),那么在一个索引中,字段可能在某个文档中,也有可能不在某个文档中,当字段不在某个文档中的时候,查询利用索引得到数据时默认情况下会将没有这个字段的文档查询出来.

mongodb 索引相关

以上实例中的查询,通过索引iage 得到了数据,但是将不包含iage字段的文档也查询出来了,  

这个时候可以通过稀疏索引将那些没有包含索引字段的文档过滤掉.

 

以下是一个通过稀疏索引过滤不包含索引字段的的文档的例子:

从执行计划中可以看到,查询是通过稀疏索引得到数据的,并且查询出来的结果集中全部包含iage字段(过滤掉了没有包含iage的文档).

mongodb 索引相关

 

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();

 mongodb 索引相关

 

 

(2)查看当前架构下的所有索引信息   :db.system.indexes.find({});

 mongodb 索引相关

 

(3)创建索引:db.collection.ensureIndex({key:1},{unique:true,dropDups:true,sparse:true})

  上面是创建索引的标准语法,第二个大括号({unique:true,dropDups:true,sparse:true})为索引类型参数。

  Unique:表示唯一索引。

  Sparse:表示稀疏索引.

  dropDups:当索引字段中存在重复值时,强制删除重复的文档,该参数会丢失数据,不建议使用该参数.

 

(4)hint({}):强制使用某个键值(索引)

下面实例中,从执行计划可以看出,强制使用索引了。

 

mongodb 索引相关

 

 

(5).删除索引:db.collection.dropIndexes() ,db.collection.dropIndex(index)

   

  db.collection.dropIndexes():删除集合下面的所有索引.

  

mongodb 索引相关

 

集合test下面已经没有可删除的索引,_id_ 是系统自带的索引,无法手动删除.

 

  db.collection.dropIndex(index_name):删除指定索引

  mongodb 索引相关

 

 

(6).当索引效率低下的时候(可能是碎片较多),就需要重建索引了。db.test.reIndex() 

  db.test.reIndex():重建索引

mongodb 索引相关

 

重建单个索引或是 集合下的所有索引。

 

  

4.执行计划解读

正确解读一个查询的执行计划是优化查询的第一步,所以必须准确的读懂查询的执行计划:

mongodb 索引相关

 







 

 

 

相关内容

热门资讯

【第一资讯】“开心安徽比鸡怎么... 有 亲,根据资深记者爆料开心安徽比鸡是可以开挂的,确实有挂(咨询软件无需...
终于了解“授权大厅牛牛开挂器?... 有 亲,根据资深记者爆料授权大厅牛牛是可以开挂的,确实有挂(咨询软件无需...
今日重磅消息“免安装麻将机干扰... 网上科普关于“免安装麻将机干扰器有没有挂”话题很是火热,小编也是针对免安装麻将机干扰器作*弊开挂的方...
2025金融大模型评测体系在沪... 证券时报记者 陈雨康 上海人工智能实验室与上海库帕思科技有限公司联合主办的“2025金融大模型评测体...
【今日要闻】“海贝大厅炸/金/... 网上科普关于“海贝大厅炸/金/花有没有挂”话题很是火热,小编也是针对海贝大厅炸/金/花作*弊开挂的方...
终于了解“杭州麻将到底是不是挂... 家人们!今天小编来为大家解答杭州麻将透视挂怎么安装这个问题咨询软件客服徽4282891的挂在哪里买很...
我来教教您“至尊宝牛牛究竟有挂... 我来教教您“至尊宝牛牛究竟有挂吗?”(太坑了原来有挂)您好,至尊宝牛牛这个游戏其实有挂的,确实是有挂...
【第一消息】“开心泉州麻将怎么... 有 亲,根据资深记者爆料开心泉州麻将是可以开挂的,确实有挂(咨询软件无需...
终于明白“网易麻将怎么装挂?”... 终于明白“网易麻将怎么装挂?”(果然有透视挂)您好,网易麻将这个游戏其实有挂的,确实是有挂的,需要了...
【今日要闻】“微信麻将是不是有... 网上科普关于“微信麻将有没有挂”话题很是火热,小编也是针对微信麻将作*弊开挂的方法以及开挂对应的知识...