设为首页 收藏本站
查看: 952|回复: 0

[经验分享] mongodb指南(翻译)(十九)

[复制链接]
YunVN网友  发表于 2015-7-9 08:01:35 |阅读模式
  后台创建索引
  默认情况下,建立索引会阻塞数据库的其他操作。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({: }).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" }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84505-1-1.html 上篇帖子: mongoDB文件太大查错纪录 下篇帖子: mongodb指南(翻译)(十四)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表