博客
关于我
MongoDB索引详解、explain执行计划详细介绍
阅读量:798 次
发布时间:2023-02-09

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

MongoDB 索引详解

MongoDB 使用 B+Tree 数据结构来存储索引,索引是集合(Collection)上非常重要的组成部分。通过合理设计和管理索引,可以显著提升查询性能,减少查询时间,提高数据库的稳定性和可用性。本文将从索引的数据结构、操作、类型以及优化建议等多个方面详细阐述。

1. 索引数据结构

MongoDB 的索引数据结构基于 B+Tree 的变种——B+Tree。B+Tree 是一种适合用于键值存储和范围查询的平衡二叉搜索树。与传统的 B-Tree 不同,B+Tree 每个节点存储更多的键值,从而减少了索引的高度,提高了查询效率。

B+Tree 的每个节点包含以下信息:

  • 页头(Page Header):存储节点的类型、节点记录的数量、以及节点在磁盘上的位置等信息。
  • 块头(Block Header):存储该节点所属的块的信息,包括块在磁盘上的起始位置等。
  • 真正的键值数据(Key/Value Pair):叶子节点(Leaf Node)存储实际的键值对,内部节点(Internal Node)仅存储键值,用于指向子节点。

WiredTiger(MongoDB 的内置键值存储引擎)使用 B+Tree 数据结构来存储索引和数据文件。每个索引都是独立的 B+Tree,存储在数据库的内存和磁盘上。

2. 索引操作

2.1 创建索引

在 MongoDB 中,创建索引的基本语法如下:

db.collection.createIndex({  key: {    field: 1, // 1 表示升序,-1 表示降序  },  options: {    background: true, // 后台创建索引    unique: true, // 唯一索引  }});
  • Key:指定索引的字段和排序方式。支持单字段和复合索引。
  • Options:包含索引的相关参数,如 background(后台创建)、unique(唯一索引)、name(索引名称)等。
  • Background:默认为 false,设置为 true 会启用后台创建,允许数据库继续处理其他操作。
  • Unique:默认为 false,设置为 true 创建唯一索引,防止重复记录。
  • Name:索引的名称,若不指定则按字段名和排序顺序生成。

2.2 查看索引

可以通过以下命令查看集合的索引信息:

db.collection.getIndexes();

此外,还可以查看索引的详细信息:

db.collection.getIndexSpecs();db.collection.getIndexKeys();

2.3 删除索引

删除索引的方法有两种:

  • 删除指定索引的命令:
    db.collection.dropIndex("索引名称");
  • 删除集合的所有索引:
    db.collection.dropIndexes();

需要注意的是,不能删除主键索引。

3. 索引类型

3.1 单键索引

单键索引在单个字段上建立,常用于精确匹配、排序和范围查询。例如:

db.collection.createIndex({ field: 1 });

3.2 复合索引

复合索引将多个字段组合在一起,适用于多字段查询。字段的顺序会影响查询性能,匹配条件应放在前面,范围条件放在后面。

db.collection.createIndex({  field1: 1,  field2: 1});

3.3 多键索引

适用于数组字段的索引。索引会针对数组中的每个元素生成条目。

db.collection.createIndex({ field: 1 });

3.4 地理空间索引

MongoDB 提供了 2dsphere 索引,用于支持地理位置查询。常用于实现“附近商家”类型的应用。

db.restaurant.createIndex({ location: "2dsphere" });

3.5 全文索引

全文索引基于文本检索,支持分词查询。创建方法如下:

db.collection.createIndex({ field: "text" });

3.6 通配符索引

支持对未知字段或嵌套对象的字段进行索引。例如:

db.collection.createIndex({ "field.$**": 1 });

4. 索引属性

索引的属性包括:

  • Background:后台创建。
  • Unique:唯一索引。
  • Name:索引名称。
  • Sparse:稀疏索引,只对存在字段的文档进行索引。
  • ExpireAfterSeconds:TTL 索引,自动过期删除文档。
  • Weights:索引权重,影响查询排序。
  • DefaultLanguage:文本索引的语言设置。
  • LanguageOverride:指定字段的语言。

5. 索引优化建议

5.1 为每个查询建立合适的索引

索引能够显著提升查询性能。对于大数据量的集合,建议为常用查询字段建立索引。

5.2 使用覆盖索引

覆盖索引只返回所需字段,减少数据传输量。

5.3 建索引后台运行

大数据集合创建索引时,建议使用后台运行选项,避免影响数据库性能。

5.4 避免过长的数组索引

数组索引会占用更多的存储空间,建议避免对长数组字段创建索引。

6. explain 执行计划

MongoDB 提供的 explain 命令可以帮助分析查询性能。通过 explain("queryPlanner") 可以获取详细的执行计划信息。

6.1 executionStats 模式

executionStats 模式提供了最佳执行计划的执行情况,包括返回的文档数量、执行时间等。

6.2 allPlansExecution 模式

allPlansExecution 模式返回了所有可能的执行计划,适用于对查询性能进行深入分析。

7. 查询阶段分析

查询阶段分为以下几个阶段:

  • COLLSCAN:全表扫描,适用于小数据量。
  • IXSCAN:索引扫描,适用于大数据量。
  • FETCH:根据索引结果集获取文档。
  • 查询阶段的优化关键点包括:

    • 避免使用 COLLSCAN,优先使用索引。
    • 避免不合理的排序和 SORT 操作。
    • 避免使用 SUBPLA(未用到索引的 $or 查询)。

    通过合理设计和管理索引,能够显著提升 MongoDB 的查询性能,实现高效的数据存储和检索。

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

    你可能感兴趣的文章
    Multicast1
    查看>>
    mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
    查看>>
    MySQL Cluster 7.0.36 发布
    查看>>
    Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
    查看>>
    MySQL Cluster与MGR集群实战
    查看>>
    multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
    查看>>
    mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
    查看>>
    Multiple websites on single instance of IIS
    查看>>
    mysql CONCAT()函数拼接有NULL
    查看>>
    multiprocessing.Manager 嵌套共享对象不适用于队列
    查看>>
    multiprocessing.pool.map 和带有两个参数的函数
    查看>>
    MYSQL CONCAT函数
    查看>>
    multiprocessing.Pool:map_async 和 imap 有什么区别?
    查看>>
    MySQL Connector/Net 句柄泄露
    查看>>
    multiprocessor(中)
    查看>>
    mysql CPU使用率过高的一次处理经历
    查看>>
    Multisim中555定时器使用技巧
    查看>>
    MySQL CRUD 数据表基础操作实战
    查看>>
    multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
    查看>>
    mysql csv import meets charset
    查看>>