索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
对单个列进行索引,默认的ID索引就是最常见的单键索引
对多个列进行联合索引,通常用于多个不同列进行组合查询。例如 根据名称name和价格price进行联合查询. 那么最有效的方式并不是 在name或者price上分别单独建立一个索引,而是创建一个索引包含 name 和 price , 还需要考虑 name 和 price的顺序 与哪个 列的 选择性有关。
唯一索引保证了 改列 是唯一的.
索引默认都是密集型的,也就是说在一个索引集合中,每个数据都会有对应的索引项,哪怕 该列没有键被索引也是如此。例如 有的文档中并不存在 颜色color 这个键 ,而有的文档中存在 color,这个不存在的color的数据也会被归结到 color这个索引 = null 中来进行查询。而稀疏索引则会跳过这个文档数据,无法通过color来进行查询.
稀疏索引使用通常在下面两种情况: 1 当一个集合中code字段是建立了唯一索引,但是最开始并不知道 code的数据,后面才会更新进去,那么这个时候只有第一次写入数据成功,因为第一次 写入的数据code 是null,后面再写入的时候code为null的已经存在,那么建立唯一索引 就应该 为
db.user.ensureIndex({"key":1},{unique:true,sparse:true})2 集合中大量文档都不包含 需要建立索引的key
hoby 是一个数组,有多个元素组成,如果在hoby上建立索引,那么对hoby中任何一个值进行查询,都能定位到这条数据.
{ "_id" : ObjectId("590a9d1723485e21b8eb19a9"), "address" : "娄底", "age" : 90, "email" : "qqtevyyelnas@.com", "height" : 175, "job" : "其他影视制品制作人员", "nickname" : "仇北设", "phone" : "19058127605", "school" : "广东青年职业学院", "sex" : 0, "hoby" : [ "西华大学", "其他缝纫制品再加工人员", "广东石油化工学院", "枪弹装配工" ], "dog" : { "name" : "裴列外", "age" : 89 } },MongoDB 通过 ensureIndex进行创建索引
语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可
db.collection.ensureIndex({KEY:1})MongoDB中多键索引是默认开启的
user:集合名 key_1:索引名称
db.collection.dropIndex(indexName)同上删除索引
db.collection.dropIndexes()删除这个集合下所有的除了ID索引之外的索引.
1 注意索引的构建地点,尽量避免在应用程序中进行构建(比如在Java中通过驱动),而是通过shell 进行构建。 2 注意索引的构建时间成本,有时候数据量巨大,构建索引会很久,几小时,甚至几天,这种情况不要在生成环境中进行构建.导致应用系统无法正常使用,通常有两种情况进行解决。 后台索引:后台索引会在后台进行构建索引,但是构建索引的任务会在当其他读写数据库的时候停下来,运行读写操作进行. 离线索引:让其中一个副节点下线进行构建,构建完毕之后与主节点同步数据,然后把该节点上升为主节点. 3 备份:mongodump和mongorestore这两个工具仅仅保留了索引的构建语句并不会把索引进行备份,这时候需要直接复制mongodb的数据文件.