MongoDB索引简介

http://www.mongoing.com/archives/2797

参看网址

说明:页码为 MongoDB权威指南这本书的

建立索引:

db.users.ensureIndex({“age”:1,”username”:1})

点查询:用于查找单个值(尽管可能有很多文档)

db.user.find({“age”:21}).sort({“username”:-1})

多值查询:查找多个值相匹配的文档,会在内存对文档进行排序。结果集大于 32M会终止

db.user.find({“age”:{“$gte”:21,”$lte”:30}}).sort({“username”:1})

explain() hint() 使用:查看执行计划,和强制使用某个索引

db.user.find({“age”:{“$gte”:21,”$lte”:30}}).sort({“username”:1}).explain()

db.user.find({“age”:{“$gte”:21,”$lte”:30}}).sort({“username”:1}).hint({“username”:1,”age”:1})

复合索引:当排序使用多个键时,索引方向才有用。相互反转的索引是等价的。

覆盖索引:当查询的字段都在索引中时,可以直接通过索引就可以提取出文档而不必在去找文档,有时需要排除掉_id字段,除非它是索引的一部分

隐式索引:复合索引可以当做其他索引来使用,只要符合最左前缀原则。

$where$exists$nin不会使用索引,对于稀疏索引(与关系型数据库概念完全不一样)不能使用$exist查询。大多数的$not查询都会使用全表扫描。对于此类查询,一般要先进行前置语句过滤,排除掉到部分的数据集。当然过滤语句最好使用索引

在一次查询中使用两个范围通常会导致低效率的查询

$OR查询的每个子句都可以使用索引,$OR查询会合并两个子句的匹配结果,同时$OR会去除重复数据,这使得$OR查询效率受很大影响。因此能换用$IN操作符的就换

索引嵌套文档时,对整个嵌套文档整体进行索引和对嵌套文档内的某个字段进行索引是不一样的。整个内嵌文档的索引在使用时查询条件必须是整个嵌套文档满足...,对于内嵌文档的某个字段和单个字段索引一样

96

对数组进行索引时,实际上是对每个元素进行索引这个索引称之为多建索引,而且一个索引汇总最多只能有一个数据字段(主要是为了防止索引爆炸)

96

索引类型:唯一索引、复合唯一索引。注意唯一索引中不能有多个文档的某个字段都是null

创建唯一索引:db.users.ensureIndex({“username”:1},{“unique”:true})

强制创建唯一索引(会将有重复的数据删除,一般只保留第一条。重要数据不要使用):

db.users.ensureIndex({“username”:1},{“unique”:true”dropDups”:true})

注意对于,文档字段大于1024字节的,是不会包含到索引中的,所以可能在依靠索引进行查询时,丢失该数据(需要进行全表扫描才能查到)。而且如果是唯一索引,也不会起到限制作用,可以同时插入多条相同的字段大于1024字节的记录到数据库中。

104

稀疏索引和关系型数据库中的概念是完全不一样的,稀疏索引表示若某字段不存在(该字段在整个集合上为索引),则当前文档不会被索引。这也是为什么不能用$exist操作符的原因。

106

全文索引在一个集合上只能有一个,但一个全文索引和已包含多个字段。直接创建即可。

全文索引对于复制和分片都有一定的性能影响。对于优化全文索引,一般使用符合索引,与全文索引构成前缀或者后缀。尽量降低全文检索数据集的量。

db.runoob.ensureIndex({"name":"text"})  ##建立全文索引

db.runoob.ensureIndex({"name":"text","age":1})  ##建立带有后缀的全文索引

116

地理空间索引,点、线、多边形类型的地理表示方。相应的查询有,与某区域交集、在某区域内,或者距离某点多大距离(最后这个查询必须使用索引,但是建议所有的都建立索引)。

对于优化地理空间索引,一般也是使用复合索引,来进行提前过滤。2d索引一般仅仅用于

平面坐标,不可代替地理空间索引。对于2d索引可以进行和某点的距离的查询、在某个区域内的查询(对于在某区域内的查询,球面坐标和这个是不一样的,球面坐标要求所有的点必须都在该区域内,二平面坐标只要求一个点在区域内,这个文档就算是符合要求的。注意这一点)

123

猜你喜欢

转载自blog.csdn.net/donghaixiaolongwang/article/details/79885135