您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
mongodb-索引
发布时间:2017-11-22 19:00:52编辑:雪饮阅读()
索引提高查询速度,降低写入速度,权衡常用的查询字段,不必在太多列上建立索引
在mongodb中索引可以按字段升序降序来创建便于排序
默认是用btree来组织索引文件,2.4版本后也允许建立hash索引
查看查询计划
explain函数可以查看要查询语句的一些性能信息。
db.stu.find({sn:900}).explain();
如下两个字段需要注意
cursor字段值若为BasicCursor则说明使用的是默认索引,即从第一条查到最后一条挨个判断是否满足查询条件。
nscannedObjects表示该查询理论应该扫描多少条记录才可以查询到符号条件的记录
"cursor" : "BasicCursor",
"nscannedObjects" : 1000,
添加索引:
ensureIndex函数可以添加索引,参数中的key-val键值对中val为1则为正序索引,若为-1则为倒序索引
db.stu.ensureIndex({sn:1})
查看索引
getIndexes函数可以查看建立的所有索引
db.stu.getIndexes();
删除索引
删除索引要将索引类型(如正序还是倒序)添加正确,否则无法删除
db.stu.dropIndex({name:-1})
删除所有索引:
默认的_id索引是无法被删除掉的
db.stu.dropIndexes()
添加多列索引:
db.stu.ensureIndex({sn:1,name:1});
子文档查询:
有两条数据如:
db.shop.insert({name:'nokia',spc:{w:120,area:'taiwan'}})
db.shop.insert({name:'oppor9s',spc:{w:480,area:'hanguo'}})
需要查询spc中area属性值为‘taiwan’的数据如
db.shop.find({'spc.area':'taiwan'})
给子文档添加索引
这里给spc字段的area字段添加索引
db.shop.ensureIndex({'spc.area':1})
创建唯一性索引:
db.tea.insert({name:'1509272975@qq.com'})
建立稀疏索引:
当给一个字段添加索引后,如果按索引来查询会发现即便某些文档不存在该字段也会为其建立该字段的索引,如:
给name添加索引
db.tea.ensureIndex({name:1},{unique:true})
添加一个空对象
db.tea.insert({})
刚添加的空对象中name为null,但用name为null作为查询条件来查看其查询计划时会发现计划中该字段也使用了索引。
db.tea.find({name:null}).explain()
然后db.tea.find({name:null})也能查询到结果
建立稀疏索引
db.tea.ensureIndex({name:1},{sparse:true})
查看查询计划
db.tea.find({name:null}).explain()
查询结果
db.tea.find({name:null});
此时会发现查询结果压根看不到
注意:经测试在2.4.5上面的确最后查询结果看不到但在2.6.6上面最后查询结果又可以看到了。
这就是稀疏索引区别于上面直接添加索引的形式的区别,稀疏索引所在的字段若某个文档没有该字段就不为其建立索引。
建立哈希索引:
建立哈希索引
db.tea.ensureIndex({name:'hashed'})
查看执行计划
db.tea.find({name:'1509272975@qq.com'}).explain()
查询
db.tea.find({name:'1509272975@qq.com'})
哈希索引在范围查询上面效率比较低
查询计划cursor字段值为”BtreeCursor name_1”这是表示使用name升序的排序
查询计划cursor字段值为”BtreeCursor name_hashed”这是表示使用name字段哈希索引了
重建索引:
一个表经过很多次修改后,导致表的文件产生空洞,索引文件也如此。可以通过索引的重建来提高索引的效率。可以减少索引文件碎片。
db.tea.reIndex()
关键字词:mongodb,索引