多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 普通单列索引 测试代码: ~~~ > for(var i=0;i<200000;i++){ ... db.java.insert({name:'xiao'+i,age:i}) ... } ~~~ 第一:先检验一下查询性能 var start = new Date() db.java.find({name:'xiao156778'}) var end = new Date() end-start 第二:为name创建索引 db.java.ensureIndex({name:1}) 第三:再执行第一部分代码可以看出有数量级的性能提升 没有添加索引时使用时间是 添加索引 db.java.ensureIndex({name:1}) 添加完成后,再次查询 语法: db.集合名.ensureIndex({键名:1}) 1是升续 -1是降续 # 多列索引(复合索引) 创建多列索引 db.集合名.ensureIndex({field1:1/-1, field2:1/-1}); 对name和age 建立一个复合索引 可以使用db.集合名.getIndexes()查看创建的索引情况。 ![](https://box.kancloud.cn/da865d6644637c90d142b15b9b98a1b3_2433x962.jpg) # 子文档索引 语法: db.集合名.ensureIndex({filed.subfield:1/-1}); 如下文档可以建立子文档索引 {name:’诺基亚手机1’,price:12.34,spc:{weight:100,area:’纽约’}} {name:’诺基亚手机2’,price:42.34,spc:{weight:200,area:’伦敦’}} 比如要查询weight等于100的文档。 db.goods.find({‘spc.weight’:100}) 根据当前案例,我们建立子文档索引 db.net.ensureIndex({'spc.weight':1}) # 唯一索引 语法: db.集合名.ensureIndex({name:-1},{unique:true}) # 过期索引 是在一段时间后会过期的索引 在索引过期后,相应的数据会被删除 适合存储一些一段时间之后就失效的数据 db.collection.ensureIndex({time:1},{expireAfterSeconds:秒数}) **注意** 存储在过期索引字段的值必须是指定的时间类型 必须是ISODate或者ISODate数组,不能使用时间戳,否则不能被自动删除 如果指定是ISODate数组,则按照最小的时间进行删除 过期索引不能是复合索引 删除索引时间不是精确的 删除过程是后台程序每60s跑一次,而且删除也需要时间,所以存在误差 # 全文索引 集合只有一个全文索引 建立方法 ~~~ 建立一个 db.articles.ensureIndex({key:"text"}) 建立多个 db.articles.ensureIndex({key_1:"text",key_2:"text"}) 所有的都建立 db.articles.ensureIndex({"$**":"text"}) ~~~ 如何使用全文索引 ~~~ db.articles.find({$text:{$search:"coffee"}}) 查找包含aa或bb或cc db.articles.find({$text:{$search:"aa bb cc"}}) 查找aa或bb但不要cc db.articles.find({$text:{$search:"aa bb -cc"}}) 查找既包含aa又包含bb又包含cc的文档,用引号把他们包起来就好 db.articles.find({$text:{$search:"\"aa\" \"bb\" \"cc\""}}) ~~~ --- 全文索引相似度 $meta操作符:{score:{$meta:"textScore"}} 写在查询条件后面可以返回结果的相似度,与sort一起使用,可以达到很好的实用效果 例子 ~~~ db.articles.find({$text:{$search:"aa bb cc"}},{score:{$meta:"textScore"}}) ~~~ 还可以排序 ~~~ db.articles.find({$text:{$search:"aa bb cc"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}}) ~~~ --- 限制 全文索引非常强大,当同样存在限制: 每次查询,只能指定一个$text查询 $text查询不能出现在$nor查询中 查询中如果包含了$text,hint不再起作用 还不支持中文 # 查看索引 常用命令: (1)查看当前索引状态: db.集合名.getIndexes(); (2)详情查看本次查询使用哪个索引和查询数据的状态信息。 db.集合名.find({name:’xiao’}).explain() ![](https://box.kancloud.cn/2c165a9499f8bfe4b8da5fda1d4d6c9b_1174x734.jpg) ![](https://box.kancloud.cn/abe1a03570af467617582a16fa1f5f7f_1178x640.jpg) # 删除索引 删除单个索引 db.集合名.dropIndex({filed:1/-1}); 删除所有索引 db.集合名.dropIndexes(); # 重建索引 一个表经过很多次修改后,导致表的文件产生空洞,索引文件也如此. 可以通过索引的重建,减少索引文件碎片,并提高索引的效率. 类似mysql中的optimize table mysql里面使用optimize table语法:optimize table 表名 语法:db.集合名.reIndex() # 索引使用注意事项 (1)创建索引的时候,注意1是正序创建索引 -1是倒叙创建索引 (2)索引的创建在提高查询性能的同时会影响插入性能,对于经常查询少插入的文档可以考虑用索引 (3)复合索引要注意索引的先后顺序。 (4)每个键全建立索引不一定就能提高性能,索引不是万能的。 (5)在做排序工作的时候如果是超大数据量也可以考虑加上索引用来提高排序的性能。 # 索引构建情况分析 ## mongostat 自带的 使用 mongostat -h ip:端口 如果有用户名和密码 -u -p 字段说明: 索引情况:idx miss qr读队列 qw写队列