循环插入数据
for(i=0;i<500000;i++){db.test.insert({name:'liangqicong'+i,age:i})}
查询有多少条数据
db.test.count()
慢查询配置
db.getProfilingStatus()
{ "was" : 0, "slowms" : 100, "sampleRate" : 1 } #这里表示超过100毫秒的查询就会记录在mongodb.log这个日志里面
执行查询语句
db.test.find({age:9999})
查看日志,可以看到执行了161毫秒
2019-02-16T11:59:51.118+0800 I COMMAND [conn1] command liangqicong.test appName: "MongoDB Shell" command: find { find: "test", filter: { age: 9999.0 }, lsid: { id: UUID("5cd66bb1-dfec-4f6e-860a-b44bc97a2dce") }, $db: "liangqicong" } planSummary: COLLSCAN keysExamined:0 docsExamined:500000 cursorExhausted:1 numYields:3909 nreturned:1 reslen:169 locks:{ Global: { acquireCount: { r: 3910 } }, Database: { acquireCount: { r: 3910 } }, Collection: { acquireCount: { r: 3910 } } } protocol:op_msg 161ms
查看查询语句的性能
db.test.find({age:9999}).explain(true)
其中会有显示
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 157,
"totalKeysExamined" : 0,
"totalDocsExamined" : 500000, #总共扫描了500000
"executionStages" : {
"stage" : "COLLSCAN", #这里是表示全表查询
"filter" : {
"age" : {
"$eq" : 9999
}
},
因为是全表查询模式,而且扫描了500000行,因此会很慢。
查看表里面有什么索引
> db.test.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "liangqicong.test"
}
]
为age字段添加索引
db.test.ensureIndex({age:1}) (升序)
删除索引
db.test.dropIndex({age:1})
如果用正则去搜索数据的话,索引是无效的。
mongodb建立唯一索引
db.test.ensureIndex({userid:1},{unique:true})
这样,userid就一定是唯一的,跟主键差不多。