mongodb指南(翻译)(十九) developer zone 索引(三)索引的删除、重建、版本

后台创建索引

默认情况下,建立索引会阻塞数据库的其他操作。V1.3.2及更高版本提供了后台创建索引的功能。

删除索引

删除指定集合的所有索引:

db.collection.dropIndexes();

删除单个索引:

db.collection.dropIndex({x: 1, y: -1})

不使用辅助函数,直接作为命令来运行:

// note: command was "deleteIndexes", not "dropIndexes", before MongoDB v1.3.2
// remove index with key pattern {y:1} from collection foo
db.runCommand({dropIndexes:'foo', index : {y:1}})
// remove all indexes:
db.runCommand({dropIndexes:'foo', index : '*'})

重建索引

重建索引命名会重建集合中所有的索引:

db.myCollection.reIndex()

关于索引的其他注意事项

  • mongodb索引(和通常的字符串比较)是大小写敏感的。
  • 当你更新一个对象,如果这个对象使用预分配的空间来填写更新,那么仅仅相应关键字发生变化的索引会被更新。这就增强了性能。注意如果对象增大了并且必须移动,所有索引的关键字必须随后更新,这种情况会慢一些。
  • 索引信息保存在system.indexes集合中。运行db.system.indexes.find()查看所有索引信息。

太大的关键字不能被索引

 索引记录对索引最大大小有限制(值长度之和),当前大约是800字节。字段的值长度(从技术上说是索引中关键字的大小)大于该大小的文档将不能被索引。你会看到类似如下的log:

...Btree::insert: key too large to index, skipping...

针对该索引的查询不会返回未索引的文档。你可以使用特殊的索引提示来强制使用其他索引,或者实际上没有索引:

db.myCollection.find({<key>: <value too large to index>}).hint({$natural: 1})

这会使得该文档在指定的字段比较时引用到,而不是索引。

索引性能

索引使得通过关键字访问和顺序访问都非常的快。通过关键字来更新同样很快,因为Mongodb可以很快的找到这个文档进行更新。

但是,请记住每一个索引的创建都会对插入和删除操作增加一定的开销。除了将数据写入到集合中,关键字也要加入到B-Tree索引中。这样,索引最适合那些读频率远高于写频率的集合。对于写密集的集合,很多时候索引可能会带来不良影响。大多数集合是读密集的,所以大多数情境下索引是个好东西。

无索引时使用sort()

如果待返回数据集比较小(小于4MB),你可能会在无索引情况下使用sort()来返回有序的数据。对于这种情景,最好同时使用limit()和sort().

索引版本

Mongodb2.0使用一种新的数据结构来存储索引。新版本{v:1}的索引比老版本{v:0}的索引平均小了25%。这通常会带来性能上的显著提高。

目前保持向后对{v:0}索引的兼容。就是说,你可以无缝的升级到MongodbV2.0.但是,要得到新格式索引带来的好处,你需要重建索引。

将已存在的索引转换为{v:1}格式

所有创建索引的操作都默认使用{v:1}类型的索引。

  • 重建索引会将任何{v:0}的索引替换为{v:1}的索引。
    • 由于一个bug的存在,请不要在低于V2.0.0版本的从节点进行索引的重建。
  • 压缩命令会将指定集合的所有索引转换为{v:1}类型。
  • 以从源节点同步数据的方式建立的复制组从节点生成的索引类型与源节点相同。

在V2.0.1,下面的操作会将{v:0}类型索引转换到{v:1}类型:

  • repaire database命令会将所有索引转换到{v:1}类型。

回滚到低于v2.0版本的mongodb

虽然Mongodb v2.0支持老版本索引的格式,但是老版本并不支持新的格式。如果你需要回滚到一个旧的版本,服务器可以正常运行,但是查询和其他涉及到新索引的操作会记录并返回一个错误。就是说,你需要重建所有你要在老版本服务器中使用到的索引。

高于1.8.3版本的程序可以感知到索引版本字段,但是低于或等于1.8.2版本的程序不能感知到。因此如果你回顾一个{v:1}索引到1.8.2并重建索引,新索引依然会标注为{v:1},虽然它实际是{v:0}.随后你又升级到2.0,这个索引虽然在db.system.indexes中标注为{v:1}但是它将不能被使用。因此如果你需要回滚到版本低于或等于1.8.2版本,你必须删除索引然后再创建它(代替简单的重建)。

生成{v:0}索引

在Mongodb2.0中你还是可以创建{v:0}的索引。在索引创建命令中增加{v:0}选项就可以了。例如在mongo shell中:

> // defaults to a v:1 index
> db.foo.ensureIndex({name:1})
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "mydb.foo", "name" : "_id_" }
{ "v" : 1, "key" : { "name" : 1 }, "ns" : "mydb.foo", "name" : "name_1" }
> db.foo.dropIndex({name:1})
{ "nIndexesWas" : 2, "ok" : 1 }
> // create a v:0 index
> db.foo.ensureIndex({name:1},{v:0})
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "mydb.foo", "name" : "_id_" }
{ "v" : 0, "key" : { "name" : 1 }, "ns" : "mydb.foo", "name" : "name_1" }
原文地址:https://www.cnblogs.com/xinghebuluo/p/2303124.html