验证有索引的集合,对索引列的查询速度较快,但会影响插入和修改的性能 测试思路: 1、先构建两个集合,一个有自定义索引,一个没有。 2、往两个集合中插数据对比insert的性能。 3、分别从两个集合中查询数据对比select的性能。 4、分别修改两个集合中的数据对比update的性能。 采用Javascript自定义函数,或者结合explain()函数实现。 准备测试集合 > use test_index switched to db test_index > db test_index > show collections > db.index.insert({"id":0}) > db.noindex.insert({"id":0}) > show collections index noindex system.indexes > db.index.find() { "_id" : ObjectId("5176ede6082a20dd9b134a36"), "id" : 0 } > db.noindex.find() { "_id" : ObjectId("5176edf1082a20dd9b134a37"), "id" : 0 } > db.index.ensureIndex({"id":1}) > db.system.indexes.find() { "v" : 1, "key" : { "_id" : 1 }, "ns" : "test_index.index", "name" : "_id_" } { "v" : 1, "key" : { "_id" : 1 }, "ns" : "test_index.noindex", "name" : "_id_" } { "v" : 1, "key" : { "id" : 1 }, "ns" : "test_index.index", "name" : "id_1" }index集合中在键id上建立了索引,noindex集合则没有。 对比insert var index_insert = function() { var begin = new Date().getTime() for (var i = 1; i < 10001; i++) { db.index.insert({"id":i}) } return new Date().getTime() - begin; } var noindex_insert = function() { var begin = new Date().getTime() for (var i = 1; i < 10001; i++) { db.noindex.insert({"id":i}) } return new Date().getTime() - begin; } > var index_insert = function() { ... var begin = new Date().getTime() ... for (var i = 1; i < 10001; i++) { ... db.index.insert({"id":i}) ... } ... return new Date().getTime() - begin; ... } > > var noindex_insert = function() { ... var begin = new Date().getTime() ... for (var i = 1; i < 10001; i++) { ... db.noindex.insert({"id":i}) ... } ... return new Date().getTime() - begin; ... } > index_insert() 2239 > noindex_insert() 1707 > db.index.count() 10001 > db.noindex.count() 10001插入10000条数据,有索引的情况下耗时2239ms,而没有索引的情况下耗时1707ms。 对比select var index_select = function() { return db.index.find({"id":1000}).explain(); } var noindex_select = function() { return db.noindex.find({"id":1000}).explain(); } > var index_select = function() { ... return db.index.find({"id":1000}).explain(); ... } > > var noindex_select = function() { ... return db.noindex.find({"id":1000}).explain(); ... } > index_select() { "cursor" : "BtreeCursor id_1", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 1, "nscanned" : 1, "nscannedObjectsAllPlans" : 1, "nscannedAllPlans" : 1, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { "id" : [ [ 1000, 1000 ] ] }, "server" : "biao.oracle.com:27017" } > noindex_select() { "cursor" : "BasicCursor", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 10001, "nscanned" : 10001, "nscannedObjectsAllPlans" : 10001, "nscannedAllPlans" : 10001, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 25, "indexBounds" : { }, "server" : "biao.oracle.com:27017" }以索引键为查询条件查询数据时,没有索引的情况下耗时25ms,有索引时几乎是秒杀。 对比update var index_update = function() { var begin = new Date().getTime() for (var i = 10001; i < 10011; i++) { db.index.update({},{"$set":{"id":i}},{multi:true}); } return new Date().getTime() - begin; } var noindex_update = function() { var begin = new Date().getTime() for (var i = 10001; i < 10011; i++) { db.noindex.update({},{"$set":{"id":i}},{multi:true}); } return new Date().getTime() - begin; } > var index_update = function() { ... var begin = new Date().getTime() ... for (var i = 10001; i < 10011; i++) { ... db.index.update({},{"$set":{"id":i}},{multi:true}); ... } ... ... return new Date().getTime() - begin; ... } > > var noindex_update = function() { ... var begin = new Date().getTime() ... for (var i = 10001; i < 10011; i++) { ... db.noindex.update({},{"$set":{"id":i}},{multi:true}); ... } ... ... return new Date().getTime() - begin; ... } > index_update() 34 > noindex_update() 2对集合中所有的文档修改10次,有索引的情况下耗时34ms,没有索引时耗时2ms。 综上所示,有索引的集合,对索引列的查询速度较快,但会影响插入和修改的性能 转载请保留固定链接: https://linuxeye.com/database/1796.html |