千家信息网

mongodb数据库中怎么使用索引

发表于:2024-09-28 作者:千家信息网编辑
千家信息网最后更新 2024年09月28日,这篇文章将为大家详细讲解有关mongodb数据库中怎么使用索引,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在关系型数据库中索引可以加快对数据输出,非
千家信息网最后更新 2024年09月28日mongodb数据库中怎么使用索引

这篇文章将为大家详细讲解有关mongodb数据库中怎么使用索引,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

在关系型数据库中索引可以加快对数据输出,非关系型数据库也是如此,可以减小磁盘IO访问,对大数据量有显著的效果。目前mongodb支持B-Tree,unique,sparse,hash索引

在mongodb集群中生成数据

[root@node2 mongodb-4.0.8]# ./bin/mongo --host 172.16.8.24 --port 27017

MongoDB shell version v4.0.8

connecting to: mongodb://172.16.8.24:27017/?gssapiServiceName=mongodb

Implicit session: session { "id" : UUID("a1abbd3a-fe32-46ac-a959-4f8a62abd990") }

MongoDB server version: 4.0.8

Server has startup warnings:

wuhan:PRIMARY> for (var i=1;i<=1000;i++) { db.stu.insert({sn:i,name:"student"+i})}

WriteResult({ "nInserted" : 1 })

wuhan:PRIMARY> db.stu.find().count();

1000

wuhan:PRIMARY> db.stu.find();

{ "_id" : ObjectId("5ca3004015fc3dad4a419a75"), "sn" : 1, "name" : "student1" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a76"), "sn" : 2, "name" : "student2" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a77"), "sn" : 3, "name" : "student3" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a78"), "sn" : 4, "name" : "student4" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a79"), "sn" : 5, "name" : "student5" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a7a"), "sn" : 6, "name" : "student6" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a7b"), "sn" : 7, "name" : "student7" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a7c"), "sn" : 8, "name" : "student8" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a7d"), "sn" : 9, "name" : "student9" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a7e"), "sn" : 10, "name" : "student10" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a7f"), "sn" : 11, "name" : "student11" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a80"), "sn" : 12, "name" : "student12" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a81"), "sn" : 13, "name" : "student13" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a82"), "sn" : 14, "name" : "student14" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a83"), "sn" : 15, "name" : "student15" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a84"), "sn" : 16, "name" : "student16" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a85"), "sn" : 17, "name" : "student17" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a86"), "sn" : 18, "name" : "student18" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a87"), "sn" : 19, "name" : "student19" }

{ "_id" : ObjectId("5ca3004015fc3dad4a419a88"), "sn" : 20, "name" : "student20" }

Type "it" for more

wuhan:PRIMARY>

一.B-Tree索引的使用

1.单列索引使用

wuhan:PRIMARY> db.stu.ensureIndex({sn:1}) --在sn字段上创建索引

wuhan:PRIMARY> db.stu.find({sn:50}).explain(); --查看执行计划是否走索引

wuhan:PRIMARY> db.stu.getIndexKeys() --查看表中有多少键

[ { "_id" : 1 }, { "sn" : 1 } ]

wuhan:PRIMARY> db.stu.getIndexes() --查看一个表所有索引

[{"v" : 2,"key" : {"_id" : 1},"name" : "_id_","ns" : "tong.stu"},{"v" : 2,"key" : {"sn" : 1},"name" : "sn_1","ns" : "tong.stu"}]

wuhan:PRIMARY> db.stu.dropIndex({sn:1}); --删除sn字段的索引

wuhan:PRIMARY> db.stu.dropIndexes(); --删除所有索引

2.多列索引使用

wuhan:PRIMARY> db.stu.ensureIndex({name:1},{name:"IX_name"}) --创建多列索引

{"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1,"operationTime" : Timestamp(1554188377, 2),"$clusterTime" : {"clusterTime" : Timestamp(1554188377, 2),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}}

wuhan:PRIMARY> db.stu.getIndexes() --查看索引信息

[{"v" : 2,"key" : {"_id" : 1},"name" : "_id_","ns" : "tong.stu"},{"v" : 2,"key" : {"name" : 1},"name" : "IX_name","ns" : "tong.stu"}]

wuhan:PRIMARY> db.stu.dropIndex({name:"IX_name"}) --删除其中一个索引

{"operationTime" : Timestamp(1554188499, 1),"ok" : 0,"errmsg" : "can't find index with key: { name: \"IX_name\" }","code" : 27,"codeName" : "IndexNotFound","$clusterTime" : {"clusterTime" : Timestamp(1554188499, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}}

3.子文档索引使用

wuhan:PRIMARY> db.shop.insert({name:"Nokia",spc:{weight:120,area:"taiwan"}}) --写入数据

WriteResult({ "nInserted" : 1 })

wuhan:PRIMARY> db.shop.insert({name:"sanxing",spc:{weight:100,area:"hanguo"}}) --写入数据

WriteResult({ "nInserted" : 1 })

wuhan:PRIMARY> db.shop.find() --查询数据

{ "_id" : ObjectId("5ca337ff15fc3dad4a419e5d"), "name" : "Nokia", "spc" : { "weight" : 120, "area" : "taiwan" } }

{ "_id" : ObjectId("5ca3382c15fc3dad4a419e5e"), "name" : "sanxing", "spc" : { "weight" : 100, "area" : "hanguo" } }

wuhan:PRIMARY> db.shop.find({"spc.area":"hanguo"}); --查询子文档的数据

{ "_id" : ObjectId("5ca3382c15fc3dad4a419e5e"), "name" : "sanxing", "spc" : { "weight" : 100, "area" : "hanguo" } }

wuhan:PRIMARY> db.shop.ensureIndex({"spc.area":1}); --子文档创建索引

{"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1,"operationTime" : Timestamp(1554200928, 2),"$clusterTime" : {"clusterTime" : Timestamp(1554200928, 2),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}}

wuhan:PRIMARY> db.shop.getIndexes();

[{"v" : 2,"key" : {"_id" : 1},"name" : "_id_","ns" : "tong.shop"},{"v" : 2,"key" : {"spc.area" : 1},"name" : "spc.area_1","ns" : "tong.shop"}]

wuhan:PRIMARY>

二.唯一索引(唯一索引中字段值必须是唯一的)

wuhan:PRIMARY> db.stu.ensureIndex({name:1},{unique:true})

{"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1,"operationTime" : Timestamp(1554188549, 2),"$clusterTime" : {"clusterTime" : Timestamp(1554188549, 2),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}}

wuhan:PRIMARY> db.stu.getIndexes()

[{"v" : 2,"key" : {"_id" : 1},"name" : "_id_","ns" : "tong.stu"},{"v" : 2,"unique" : true,"key" : {"name" : 1},"name" : "name_1","ns" : "tong.stu"}]

wuhan:PRIMARY> db.stu.totalIndexSize() --查看索引大小

40960

wuhan:PRIMARY> db.stu.totalSize()

69632

wuhan:PRIMARY>

三.稀疏索引(字段有值就创建索引,没有值不创建索引)

wuhan:PRIMARY> db.shop.find()

{ "_id" : ObjectId("5ca337ff15fc3dad4a419e5d"), "name" : "Nokia", "spc" : { "weight" : 120, "area" : "taiwan" } }

{ "_id" : ObjectId("5ca3382c15fc3dad4a419e5e"), "name" : "sanxing", "spc" : { "weight" : 100, "area" : "hanguo" } }

wuhan:PRIMARY> db.shop.insert({}) --插入一个空值

WriteResult({ "nInserted" : 1 })

wuhan:PRIMARY> db.shop.find();

{ "_id" : ObjectId("5ca337ff15fc3dad4a419e5d"), "name" : "Nokia", "spc" : { "weight" : 120, "area" : "taiwan" } }

{ "_id" : ObjectId("5ca3382c15fc3dad4a419e5e"), "name" : "sanxing", "spc" : { "weight" : 100, "area" : "hanguo" } }

{ "_id" : ObjectId("5ca3419c15fc3dad4a419e5f") }

wuhan:PRIMARY> db.shop.ensureIndex({name:1},{sparse:true}); --创建稀疏索引

{"createdCollectionAutomatically" : false,"numIndexesBefore" : 2,"numIndexesAfter" : 3,"ok" : 1,"operationTime" : Timestamp(1554203093, 2),"$clusterTime" : {"clusterTime" : Timestamp(1554203093, 2),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}}

wuhan:PRIMARY> db.shop.find({name:"null"}); --null值不显示

wuhan:PRIMARY>

四.哈稀索引

wuhan:PRIMARY> db.t.ensureIndex({a:"hashed"});

{"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1,"operationTime" : Timestamp(1554203661, 2),"$clusterTime" : {"clusterTime" : Timestamp(1554203661, 2),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}}

wuhan:PRIMARY> db.t.find({a:"25"}).explain();

{"queryPlanner" : {"plannerVersion" : 1,"namespace" : "tong.t","indexFilterSet" : false,"parsedQuery" : {"a" : {"$eq" : "25"}},"winningPlan" : {"stage" : "FETCH","filter" : {"a" : {"$eq" : "25"}},"inputStage" : {"stage" : "IXSCAN","keyPattern" : {"a" : "hashed"},"indexName" : "a_hashed",        --显示为hash索引"isMultiKey" : false,"isUnique" : false,"isSparse" : false,"isPartial" : false,"indexVersion" : 2,"direction" : "forward","indexBounds" : {"a" : ["[7200060250846542811, 7200060250846542811]"]}}},"rejectedPlans" : [ ]},"serverInfo" : {"host" : "node2","port" : 27017,"version" : "4.0.8","gitVersion" : "9b00696ed75f65e1ebc8d635593bed79b290cfbb"},"ok" : 1,"operationTime" : Timestamp(1554203690, 1),"$clusterTime" : {"clusterTime" : Timestamp(1554203690, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}}

wuhan:PRIMARY>

五.索引重建(当索引效率不高时可以考虑重建索引)

wuhan:PRIMARY> db.t.reIndex(); --重建t表的索引

关于mongodb数据库中怎么使用索引就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

0