前言: 索引是目前测试过程中发现问题最多的地方,所以过多会引起insert操作的时间以次方上升。但同时更多索引可以让query操作响应时间大大缩短。所以好的索引策略是非常重要的。
注意:添加索引时会引起整张表暂时不可用,所以添加是需要非常谨慎的!
索引的基本操作:
查看索引
db.AuditLog.getIndexes()
获取OrganizationUnit表的所有索引。所有的表都会有一个默认的索引,而且不可删除。
创建索引
db.AuditLog.createIndex({who:1})
删除索引
db.AuditLog.dropIndex({who:1}) ---删除单个索引
db.AuditLog.dropIndexes() ---删除全部索引
策略:
1. 对于只有insert操作的表直接drop掉所有的索引即可,相反的只有query操作的表则尽可能把所有的query条件都添加上索引。
2. 如果数据库操作比较慢,需要查看是否所有索引都在ram中
db.OrganizationUnit.totalIndexSize() 333438976
3. 如果不确定慢在什么地方可以使用explain命令来查看是不是使用了索引。
db.ApplicationInformation.find({ "applicationUuid" : "1390f4b4907fea0cd2c3f904fc262f9fnCJw10j8iwK", "enterpriseId" : "test3" }).explain(true)
在返回的内容里,前面是一些查询计划和最后选择的查询方式等等内容,我们需要关注这部分:
"executionTimeMillis" : 该查询使用的总时长
"totalDocsExamined" : 扫描了多少次文档完成本次查询
一般来说我们希望nRetrurned和totalDocsExamined的值尽可能接近。