在使用 MongoDB 进行开发时,合理的索引是提升查询性能的重要手段。本文将介绍 MongoDB 索引的使用场景与优化方式,并通过示例代码示范如何优化索引。
MongoDB 索引和性能
MongoDB 是一款 NoSQL 数据库,数据存储的方式和传统的关系型数据库有很大的不同。在 MongoDB 中,数据存储的单位是文档(Document),每个文档都是一组键值对。MongoDB 的查询语句可以通过查询文档中的某个键来查找符合条件的文档。
在查询大量文档时,未经过优化的查询往往会带来很大的性能问题。为此,MongoDB 提供了索引的功能,可以通过对某个键建立索引来优化查询性能。MongoDB 支持的索引类型包括:
- 单键索引(Single Field Index):对文档中的某个键建立的普通索引。
- 复合索引(Compound Index):对文档中多个键建立的组合索引。
- 地理空间索引(Geospatial Index):对地理空间数据建立的索引。
- 全文搜索索引(Text Index):对文档中的文本内容建立的索引。
下面将介绍 MongoDB 索引的使用场景和优化方式。
MongoDB 索引的使用场景
在实际开发中,应根据具体业务场景和数据特征选择合适的索引类型。下面是几种常见的使用场景和相应的索引类型。
查询某个键的值
在查询某个键的值时,应该为该键建立单键索引。例如:
db.collection.createIndex({username: 1});
上述代码创建了一个对 username
建立的升序索引,可以提升使用 username
查找文档的性能。
查询某个键的范围
在查询某个键的范围时,应该为该键建立复合索引。例如:
db.collection.createIndex({age: 1, city: 1});
上述代码创建了一个对 age
升序、city
升序的复合索引,可以提升按照 age
、city
进行范围查询的性能。
查询地理位置
在查询地理位置时,应该为地理位置字段建立地理空间索引。例如:
db.collection.createIndex({location: "2dsphere"});
上述代码创建了一个对 location
字段建立的二维球形索引,可以提升地理位置信息的查询性能。
全文搜索
在全文搜索时,应该为包含文本内容的字段建立全文搜索索引。例如:
db.collection.createIndex({content: "text"});
上述代码创建了一个对 content
字段建立的全文搜索索引,可以提升全文搜索的性能。
MongoDB 索引的优化方式
在选择了合适的索引类型后,还需要进行优化才能发挥其最大的性能优势。下面是几种常见的优化方式。
索引覆盖
索引覆盖是指查询结果可以完全从索引中获取,而不需要进一步查询数据。例如:
db.collection.find({username: "张三"}, {_id: 0, username: 1});
上述代码中,查询结果只需要返回 username
字段,可以在单键索引的情况下完全从索引中获取,无需进一步读取文档数据,从而提升查询性能。
索引选择性
索引选择性是指索引覆盖下查询返回的记录占据总记录数的比例。如果索引选择性较低,那么使用该索引查询文档的效率将不高。应当选择较高选择性的索引。例如:
db.collection.createIndex({gender: 1});
如果 gender
字段只有两个取值,那么该索引的选择性较低,不建议使用。
索引大小
索引大小是指将一个索引完全保存到内存中所需要的空间大小。索引大小过大会影响索引的查询性能,因为大的索引需要占用更多的内存。对于复合索引,应尽量避免每个键的取值数量过大,从而减小索引大小。例如:
db.collection.createIndex({age: 1, city: 1});
如果 city
字段取值很多,那么对该字段建立索引会导致索引大小过大,应该将索引调整为 {city: 1, age: 1}
,提高索引的选择性。
示例代码
最后,我将给出使用 MongoDB 索引的示例代码。
假设有以下的集合:
-- -------------------- ---- ------- - ------ ------------------------------------- ----------- ----- ------ --- ------- ----- ----------- - ------- -------- -------------- --------- ------- -- ---------- ------- ------- -
我们可以使用以下代码为该集合创建索引:
db.collection.createIndex({username: 1}); // 创建单键索引 db.collection.createIndex({age: 1, city: 1}); // 创建复合索引 db.collection.createIndex({location: "2dsphere"}); // 创建地理空间索引 db.collection.createIndex({content: "text"}); // 创建全文搜索索引
还可以使用以下代码查看索引的使用情况:
db.collection.find({username: "张三"}).explain(); // 查看单键索引的使用情况 db.collection.find({age: {$gte: 18}}).explain(); // 查看复合索引的使用情况 db.collection.find({location: {$near: {$geometry: {type: "Point",coordinates: [116.404, 39.915]}, $maxDistance: 1000}}}).explain(); // 查看地理空间索引的使用情况 db.collection.find({$text: {$search: "World"}}).explain(); // 查看全文搜索索引的使用情况
总结
本文介绍了 MongoDB 数据库索引的使用场景与优化方式,并给出了示例代码。在实际开发中应该结合具体业务场景和数据特征选择合适的索引,从而提升查询性能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64d54ca5b5eee0b525d233df