MongoDB学习记录06-索引

xiaoxiao2021-02-28  87

概念

索引通常能够极大的提高查询的效率,如果没有索引,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})

复合索引

db.col.ensureIndex({"title":1,"description":-1})

多键索引 :

MongoDB中多键索引是默认开启的

参数说明

ParameterTypeDescriptionbackgroundBoolean建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false。uniqueBoolean建立的索引是否唯一。指定为true创建唯一索引。默认值为false.namestring索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称dropDupsBoolean在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.sparseBoolean对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 falseexpireAfterSecondsinteger指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间vindex version索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本weightsdocument索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重default_languagestring对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语language_overridestring对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language

删除索引

db.runCommand({"deleteIndexes":"user","index":"key_1"})

user:集合名 key_1:索引名称

db.collection.dropIndex(indexName)

同上删除索引

db.collection.dropIndexes()

删除这个集合下所有的除了ID索引之外的索引.

查看索引

db.collection.getIndexes()

索引注意事项

1 注意索引的构建地点,尽量避免在应用程序中进行构建(比如在Java中通过驱动),而是通过shell 进行构建。 2 注意索引的构建时间成本,有时候数据量巨大,构建索引会很久,几小时,甚至几天,这种情况不要在生成环境中进行构建.导致应用系统无法正常使用,通常有两种情况进行解决。 后台索引:后台索引会在后台进行构建索引,但是构建索引的任务会在当其他读写数据库的时候停下来,运行读写操作进行. 离线索引:让其中一个副节点下线进行构建,构建完毕之后与主节点同步数据,然后把该节点上升为主节点. 3 备份:mongodump和mongorestore这两个工具仅仅保留了索引的构建语句并不会把索引进行备份,这时候需要直接复制mongodb的数据文件.

查看索引的构建情况

db.currentOp()
转载请注明原文地址: https://www.6miu.com/read-26993.html

最新回复(0)