博客
关于我
MongoDB整理笔记の索引
阅读量:797 次
发布时间:2023-02-09

本文共 2424 字,大约阅读时间需要 8 分钟。

MongoDB 索引系统概述及其应用实践

MongoDB 的索引系统非常强大,支持多种类型的索引,极大地提升了数据查询效率。本文将详细介绍MongoDB的索引类型及其应用方法。

1. 索引基础

在 MongoDB 中,索引是一种元数据结构,用于加速查询和增删改查操作。每个集合(相当于表)都有一个默认的 _id 索引,这与其他关系型数据库的主键索引类似。

1.1 基于字段的索引

创建索引可以选择特定字段,例如在 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// }

注意:默认索引不能手动删除。

1.2 后台创建索引

在数据量较大时,索引创建可能耗时较长。可以指定 background: true 选项后台创建:

db.t3.ensureIndex({age: 1}, {background: true});

此方法适用于系统已经有大量数据的情况。

2. 文档索引

MongoDB 的索引可以应用在文档字段上,甚至可以对嵌套文档创建索引。例如,addr 字段包含嵌套的 citystate

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" }});

索引的使用取决于查询条件与索引顺序的匹配程度。

3. 组合索引

MongoDB 支持组合索引,类似于其他数据库产品。例如,可以在 addr.cityaddr.state 字段上创建组合索引:

db.factories.ensureIndex({ "addr.city" : 1, "addr.state" : 1 });

组合索引适用于需要同时查询 citystate 的场景。支持的排序方向为升序(1)和降序(-1)。

3.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 });

4. 唯一索引

为了确保数据唯一性,可以创建唯一索引。例如,在表 t4 中插入两个相同的记录后,尝试创建唯一索引:

db.t4.insert({firstname: "wang", lastname: "wenlong"});db.t4.insert({firstname: "wang", lastname: "wenlong"});

创建唯一索引:

db.t4.ensureIndex({firstname: 1, lastname: 1}, {unique: true});

此时会抛出错误,因为表中已有重复数据。

5. 强制使用索引

使用 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();

强制使用索引后,查询会优先使用索引。

6. 删除索引

删除索引的方法包括删除整个表的所有索引或单独删除特定索引:

db.t3.dropIndexes();db.t4.dropIndex({firstname: 1});

7. 查询解释(explain)

MongoDB 提供 explain 命令,帮助分析查询性能。例如,执行以下查询并解释:

db.t5.find({age: {$gt: 45}}).explain();

字段解释:

  • cursor:游标类型(BasicCursorBtreeCursor
  • nscanned:扫描的文档数量
  • nscannedObjects:扫描的文档数量
  • n:返回的文档数量
  • millis:执行时间(毫秒)
  • indexBounds:使用的索引范围

通过 explain 命令,开发者可以了解索引在查询中的应用情况,进而优化数据库性能。

转载地址:http://hiffk.baihongyu.com/

你可能感兴趣的文章
Metasploit Web认证渗透测试实战
查看>>
Metasploit Windows AD渗透测试实战
查看>>
Metasploit 文件包含与跨站请求伪造渗透测试实战
查看>>
MFC 打印预览 映射模式 坐标变换
查看>>
MFC不规则窗体
查看>>
MFC之处理消息映射的步骤...
查看>>
MFC对话框屏幕居中
查看>>
MFC工作笔记0005---::在vc++中是什么意思
查看>>
MFC工作笔记0011---atoi的用法
查看>>
MFC数据类型
查看>>
MFC模态对话框和非模态对话框
查看>>
mha高可用
查看>>
Miaoo朋友圈程序全完整版源码
查看>>
Microsoft Security Updates API 使用教程
查看>>
Milesight VPN server.js 任意文件读取漏洞(CVE-2023-23907)
查看>>
MyBatis学习总结(6)——调用存储过程
查看>>
mockcpp & testngpp在2010.7~11月的改进
查看>>
Mock模拟测试实战
查看>>
Modbus RTU和Modbus TCP之间的区别
查看>>
Model-Based Reinforcement Learning(基于模型的强化学习)详解-ChatGPT4o作答
查看>>