本文共 2622 字,大约阅读时间需要 8 分钟。
MongoDB 使用 B+Tree 数据结构来存储索引,索引是集合(Collection)上非常重要的组成部分。通过合理设计和管理索引,可以显著提升查询性能,减少查询时间,提高数据库的稳定性和可用性。本文将从索引的数据结构、操作、类型以及优化建议等多个方面详细阐述。
MongoDB 的索引数据结构基于 B+Tree 的变种——B+Tree。B+Tree 是一种适合用于键值存储和范围查询的平衡二叉搜索树。与传统的 B-Tree 不同,B+Tree 每个节点存储更多的键值,从而减少了索引的高度,提高了查询效率。
B+Tree 的每个节点包含以下信息:
WiredTiger(MongoDB 的内置键值存储引擎)使用 B+Tree 数据结构来存储索引和数据文件。每个索引都是独立的 B+Tree,存储在数据库的内存和磁盘上。
在 MongoDB 中,创建索引的基本语法如下:
db.collection.createIndex({ key: { field: 1, // 1 表示升序,-1 表示降序 }, options: { background: true, // 后台创建索引 unique: true, // 唯一索引 }});
background
(后台创建)、unique
(唯一索引)、name
(索引名称)等。false
,设置为 true
会启用后台创建,允许数据库继续处理其他操作。false
,设置为 true
创建唯一索引,防止重复记录。可以通过以下命令查看集合的索引信息:
db.collection.getIndexes();
此外,还可以查看索引的详细信息:
db.collection.getIndexSpecs();db.collection.getIndexKeys();
删除索引的方法有两种:
db.collection.dropIndex("索引名称");
db.collection.dropIndexes();
需要注意的是,不能删除主键索引。
单键索引在单个字段上建立,常用于精确匹配、排序和范围查询。例如:
db.collection.createIndex({ field: 1 });
复合索引将多个字段组合在一起,适用于多字段查询。字段的顺序会影响查询性能,匹配条件应放在前面,范围条件放在后面。
db.collection.createIndex({ field1: 1, field2: 1});
适用于数组字段的索引。索引会针对数组中的每个元素生成条目。
db.collection.createIndex({ field: 1 });
MongoDB 提供了 2dsphere 索引,用于支持地理位置查询。常用于实现“附近商家”类型的应用。
db.restaurant.createIndex({ location: "2dsphere" });
全文索引基于文本检索,支持分词查询。创建方法如下:
db.collection.createIndex({ field: "text" });
支持对未知字段或嵌套对象的字段进行索引。例如:
db.collection.createIndex({ "field.$**": 1 });
索引的属性包括:
索引能够显著提升查询性能。对于大数据量的集合,建议为常用查询字段建立索引。
覆盖索引只返回所需字段,减少数据传输量。
大数据集合创建索引时,建议使用后台运行选项,避免影响数据库性能。
数组索引会占用更多的存储空间,建议避免对长数组字段创建索引。
MongoDB 提供的 explain
命令可以帮助分析查询性能。通过 explain("queryPlanner")
可以获取详细的执行计划信息。
executionStats
模式提供了最佳执行计划的执行情况,包括返回的文档数量、执行时间等。
allPlansExecution
模式返回了所有可能的执行计划,适用于对查询性能进行深入分析。
查询阶段分为以下几个阶段:
查询阶段的优化关键点包括:
COLLSCAN
,优先使用索引。SORT
操作。SUBPLA
(未用到索引的 $or
查询)。通过合理设计和管理索引,能够显著提升 MongoDB 的查询性能,实现高效的数据存储和检索。
转载地址:http://isffk.baihongyu.com/