zoukankan      html  css  js  c++  java
  • MongoDB学习笔记-04 索引

    索引是用来加速查询的。有了索引之后,数据库不必进行全表扫描,只需先在索引中查找,再根据找到的索引查找数据。MongoDB的索引几乎和传统关系型数据库一样。

    创建索引

    创建索引是在相应的集合中使用ensureIndex()方法。

    >db.user.ensureIndex({"username":1})

    要创建查询中用到的所有键的索引。传递给ensureIndex方法的文档形式与传递给sort的一样:1或-1表示索引的方向。若索引只有一个键时,方向则无关紧要。

    >db.user.ensureIndex({"username":1, "age":-1})

    一般来说,如果包含N个件的索引,则对前几个键的查询都会有帮助,如索引:{"a":1,"b":1,"c":1,…,"z":1}实际上就有了{"a":1}、{"a":1,"b":1}、…等索引。

    创建索引的缺点是每次插入、更新和删除时都会产生额外的开销,因为数据库不但需要执行这些操作,还要将这些操作在集合的索引中标记。

    建索引时需要考虑的问题

    1)会做什么样的查询?哪些键需要索引?

    2)每个键的索引方向是怎样的?

    3)如何应对扩展?有没有种不同键的排列可以使常用数据更多地保留在内存中?

    内嵌文档的键索引和普通键索引并无差异。

    索引名称

    集合中的每个索引都有一个字符串类型的名字,来唯一标识索引,服务器通过这个名字来删除或者操作索引。默认情况下,索引的名字类似于:keyname1_dir1_keyname2_dir2…

    keynameX表示索引的键,dirX表示索引的方向。

    可以通过ensureIndex的选项来指定自定义的名字:

    >db.user.ensureIndex({"a":1,"b":1,"c":1,…,"z":1},{"name":"indexName"})

    唯一索引

    唯一索引可以确保集合的每个文档的指定键都有唯一的值。

    >db.user.ensureIndex({"username":1},{"unique":true})

    集合中的默认唯一所以_id是在集合创建时一同创建,且不能删除。

    消除重复

    当为已有的集合创建索引,可能有些值已经有重复,此时创建唯一索引便会失败。可以通过dropDups选项来保留发现的第一个文档,而删除接下来的有重复值的文档:

    >db.user.ensureIndex({"username":1},{"unique":true, "dropDups":true})

    注意:这种做法要慎重,如果数据重要的话,比较稳妥的办法是写个脚本进行预处理。

    复合唯一索引

    复合唯一索引,单个键的值可以相同,只要所有键的值组合起来不同即可。

    >db.user.ensureIndex({"username":1, "age":-1},{"unique":true })

    使用explain和hint

    explain可以对查询做分析。而hint可以强制使用某个索引:

    >db.user.find({"age":14,"username":"wangdh"}).hint({"username":1,"age":1})

    管理索引

    索引的元数据信息存储在每个数据库的system.indexes集合中,该集合是只读的。只能通过ensureIndex或者dropIndexes进行。

    1)修改索引

    >db.user.ensureIndex({"username":1},{"background":true})

    Background选项可以在后台执行,避免数据库建索引时阻塞请求。

    为已有文档创建索引比先创建索引再插入所有文档要稍快一点。

    2)删除索引

    使用dropIndexes加上索引名可以删除索引。

    >db.runCommand({"dropIndexes":"collectionName","index":"indexName"})

    删除集合也可以删除索引,删除集合的所有文档并不会影响到索引。

    地理空间索引

    MongoDB还提供了空间地理索引,并提供了相关的查询

  • 相关阅读:
    什么是css权重
    html5 canvas画五角星(美国队长)
    从输入URL到页面加载发生了什么
    javascript之事件委托(转)
    javascript之常用排序算法
    javascript之闭包
    javascript二维数组的删除
    javascript之apply()、call()
    div+css两列布局与三列布局
    css处理水平居中问题(淘宝双飞翼布局)
  • 原文地址:https://www.cnblogs.com/Jxwz/p/4176961.html
Copyright © 2011-2022 走看看