索引操作
日常开发中我们都需要对程序进行性能优化。
mongodb的索引会带来怎样的性能提升呢?
我们先插入10w条数据
db.person.remove()
for(var i=0;i<100000;i++){
db.person.insert({"name":"zjs"+i,"age":i})
}
一:性能分析函数(explain)
db.person.find({"name":"zjs"+10000}) 查询到结果,好,我们的数据已经插入成功,mongodb给我们提供了一种分析工具。这里name字段没有建立任何索引,这里我们就查询一个“name10000”的姓名。
这里有几个关键的字段
cursor:这里为BasicCursor,意思是采用表扫描,也就是顺序查找。
nscanned:100000,意思就是数据了浏览了10W个文档。
n:这里为1,也就是最终返回了1个文档。
millis:耗时78毫秒。
下面我们使用索引
这里我们使用ensureIndex对name设置索引 1表示对name进行升序,-1表示对name进行降序。
我们可以看到 cursor为 BtreeCursor mongodb采用B树的结构来存放索引,索引名为后面的“name_1"
nscanned为1 n:1 millis:竟然为0。
二:唯一索引
db.person.ersureIndex({“name”:1},{"unique":true})
三:组合索引
有时候我们的查询不是单条件的,可能是多条件,比如查找出生于“1995-05-03”名字为bob的同学。我们可以建立姓名和生日的联合索引来加速查询。
db.person.ensureIndex({"name":1,"birthday":1})
db.person.ensureIndex({"birthday":1,"name":1})
上面两种建立的索引不同,升序和降序的顺序不同都会产生不同的索引。
我们可以使用db.person.getIndexes()来查看到底产生了哪些索引。
那查询优化器会使用哪个查询操作作为操作呢?
它会给我们做出最优的选择,我们做查询时,查询优化器会使用我们建立的这些索引来创建查询方案
,如果某一个先执行完则其他查询方案被close掉,这种方案会被mongodb保存起来,当然如果非要自己指定
的查询方案,这也是可以的,在mongodb中给我们提供了hint方法让我们可以暴力执行。
db.person.find({"birthday":"1989-2-4","name":"bob"}).hint({"birthday":1,"name":1}).explain()
四:删除索引
可能随着业务需求的变化,原先建立的索引可能没有存在的必要了,我们需要删除,索引会降低cud这三种操作的性能。
db.person.dropIndexes("name_1")