本文共 2424 字,大约阅读时间需要 8 分钟。
MongoDB 的索引系统非常强大,支持多种类型的索引,极大地提升了数据查询效率。本文将详细介绍MongoDB的索引类型及其应用方法。
在 MongoDB 中,索引是一种元数据结构,用于加速查询和增删改查操作。每个集合(相当于表)都有一个默认的 _id
索引,这与其他关系型数据库的主键索引类似。
创建索引可以选择特定字段,例如在 age
字段上创建索引。索引支持升序(1
)和降序(-1
)两种方向:
db.t3.ensureIndex({age: 1});
建立索引后可以通过 db.t3.getIndexes()
查看索引情况:
db.t3.getIndexes();// 输出示例://{// "name" : "_id_",// "ns" : "test.t3",// "key" : { "_id" : 1 },// "v" : 0// },//{// "_id" : ObjectId("4fb906da0be632163d0839fe"),// "ns" : "test.t3",// "key" : { "age" : 1 },// "name" : "age_1",// "v" : 0// }
注意:默认索引不能手动删除。
在数据量较大时,索引创建可能耗时较长。可以指定 background: true
选项后台创建:
db.t3.ensureIndex({age: 1}, {background: true});
此方法适用于系统已经有大量数据的情况。
MongoDB 的索引可以应用在文档字段上,甚至可以对嵌套文档创建索引。例如,addr
字段包含嵌套的 city
和 state
:
db.factories.insert({name: "wwl", addr: { city: "Beijing", state: "BJ" }});
创建 addr
字段上的索引:
db.factories.ensureIndex({addr: 1});
这样可以支持如下的查询:
db.factories.find({addr: { city: "Beijing", state: "BJ" }});
然而,如果查询顺序与索引顺序不一致,则可能未使用索引:
db.factories.find({addr: { state: "BJ", city: "Beijing" }});
索引的使用取决于查询条件与索引顺序的匹配程度。
MongoDB 支持组合索引,类似于其他数据库产品。例如,可以在 addr.city
和 addr.state
字段上创建组合索引:
db.factories.ensureIndex({ "addr.city" : 1, "addr.state" : 1 });
组合索引适用于需要同时查询 city
和 state
的场景。支持的排序方向为升序(1
)和降序(-1
)。
以下查询都能利用组合索引:
db.factories.find({ "addr.city" : "Beijing", "addr.state" : "BJ" });db.factories.find({ "addr.city" : "Beijing" });db.factories.find().sort({ "addr.city" : 1, "addr.state" : 1 });db.factories.find().sort({ "addr.city" : 1 });
为了确保数据唯一性,可以创建唯一索引。例如,在表 t4
中插入两个相同的记录后,尝试创建唯一索引:
db.t4.insert({firstname: "wang", lastname: "wenlong"});db.t4.insert({firstname: "wang", lastname: "wenlong"});
创建唯一索引:
db.t4.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
此时会抛出错误,因为表中已有重复数据。
使用 hint
命令可以强制使用特定索引:
db.t5.insert({name: "wangwenlong", age: 20});db.t5.ensureIndex({name: 1, age: 1});db.t5.find({age: {$lt: 30}}).explain();
默认情况下,查询可能不使用索引:
db.t5.find({age: {$lt: 30}}).hint({name: 1, age: 1}).explain();
强制使用索引后,查询会优先使用索引。
删除索引的方法包括删除整个表的所有索引或单独删除特定索引:
db.t3.dropIndexes();db.t4.dropIndex({firstname: 1});
MongoDB 提供 explain
命令,帮助分析查询性能。例如,执行以下查询并解释:
db.t5.find({age: {$gt: 45}}).explain();
字段解释:
cursor
:游标类型(BasicCursor
或 BtreeCursor
)nscanned
:扫描的文档数量nscannedObjects
:扫描的文档数量n
:返回的文档数量millis
:执行时间(毫秒)indexBounds
:使用的索引范围通过 explain
命令,开发者可以了解索引在查询中的应用情况,进而优化数据库性能。
转载地址:http://hiffk.baihongyu.com/