MongoDB 是一款开源且高性能的 NoSQL 数据库,用于存储非结构化数据。MongoDB 的查询是基于文档的。在实际开发中,我们经常需要查询大量数据,因此索引就显得十分重要。索引可以大大加速查询效率,同时减小数据库的压力。
MongoDB 支持多种类型的索引,下面我们就来了解一下各种类型的索引和它们的使用场景。
单字段索引(Single-field Index)
单字段索引是 MongoDB 中最常见的索引类型。它是基于单一域的索引,通过将一个域的值存储在索引中并按照该域进行排序,快速提高了查询速度。
我们可以通过以下代码来创建单字段索引:
db.collection.createIndex( { field: 1 } ); // 1 表示升序,-1 表示降序
单字段索引适用于单个字段的查询、排序和聚合计算。但是也有一些注意事项:
- 过多的索引会减慢写入操作的速度,因为每次写入时都会更新索引。
- 单字段索引一般适用于查询结果集较大的情况,因为只有查询结果集的数量占比较大时才能体现出索引的优势。
- 当查询语句中涉及多个字段时,单字段索引将不再适用。
复合索引(Compound Index)
复合索引是基于多个域的索引。可以将多个域的值存储在同一个索引结构中,使得查询更加高效。复合索引适用于多个字段的查询、排序和聚合计算。
我们可以通过以下代码来创建复合索引:
db.collection.createIndex( { field1: 1, field2: -1 } );
复合索引需要注意以下几点:
- 复合索引中的字段顺序非常重要。应该优先考虑经常作为查询条件的字段,并将其放置在索引的最前面。
- 复合索引的大小取决于添加的字段数量和字段类型。过多的字段会减慢查询速度,过大的索引会占用太多内存和磁盘空间。
- 复合索引不能跨越不同的集合。如果需要在多个集合中进行联合查询,就需要使用视图、联合查询、聚合操作等技术。
文本索引(Text Index)
文本索引是使用全文搜索索引来搜索文档内的文本数据。文本索引通常用于在大型文本文档集中执行复杂的文本搜索。在 MongoDB 中,可以使用 $text
操作符进行文本搜索。
我们可以通过以下代码创建文本索引:
db.collection.createIndex( { field: "text" } );
需要注意以下几点:
- 文本索引只能应用于字段类型为字符串或数组的字段。
- 一些特殊字符会被忽略,例如标点符号。
地理位置索引(Geospatial Index)
地理位置索引被用于存储地理空间数据。可以用于查询在附近的地址、城市、地标等。
我们可以通过以下代码创建地理位置索引:
db.collection.createIndex( { "location": "2dsphere" } );
需要注意以下几点:
- 地理位置索引只能应用于存储地理位置数据的字段。
- 地理位置索引的查询是基于地理位置计算的,而不是基于字典顺序或数字顺序。
- MongoDB 中的地理位置索引支持多种地理位置数据类型,如点、线、面等。
- 地理位置索引需要进行一些额外的设置,如设置计算地球半径的方法等。
Hashed Index
Hashed Index 是一种新的索引类型。它可以在指定的键上运用可变长度的哈希方法。这种索引类型适用于哈希元素比较小的非线性查询场景。
我们可以通过以下代码创建 Hashed Index:
db.collection.createIndex( { field: "hashed" } );
需要注意以下几点:
- Hashed Index 适用于只需要进行等值查询的情况,支持的查询操作包括
$eq
等。 - Hashed Index 只能对值进行哈希,不能进行范围查询,所以它不能用于排序或聚合。
- 当哈希冲突率高时,Hashed Index 的性能会受到影响。
总结
不同类型的索引适用于不同的场景,合理使用索引可以充分发挥 MongoDB 的查询性能。在创建索引时,需要考虑索引的大小、查询的复杂度、查询频率等因素。除此之外,合理地使用索引也可以减少服务器端的开销。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6536106d7d4982a6ebde725b