1. 什么是索引
索引是一个排序的数据结构,用于提高数据库的查询效率。在 MongoDB 中,索引可以用来快速的查询数据,从而避免扫描整个集合去进行查找。通过创建索引,MongoDB 可以更快的查询和返回数据。索引往往是管理数据的关键之一,特别是在大型数据集的时候。
1.1 数据库索引的优势
没有索引的数据库查询往往会采用全文扫描(tablescan)或者类似于二分查找的方法(binary searching),耗费时间和计算资源。索引作为一种优化数据库查询的策略,通过提供数据的快速访问路径来大大提高查询效率。
1.2 预测查询结果
索引还可以帮助 MongoDB 更好地预测查询结果,从而更优化查询计划。当查询语句中包含查询条件时,MongoDB 会使用 explain() 来自动创建索引,然后运用优化算法判断是否需要调整查询计划。如果数据量很大,MongoDB 会做出选择,只扫描相关的索引。
2. 索引的类型
2.1 单字段索引
单字段索引常见于关系型数据库中,它会对某个字段建立索引,使查询能够快速匹配该字段的值。MongoDB 支持对一个字段、多个字段或者一个文档创建多个索引。下面是单字段索引的创建方式:
db.collection.createIndex( { name: 1 } )
其中,createIndex() 方法用来创建索引,{ name: 1 } 表示对 name 字段进行正向排序(从小到大),而 -1 表示逆向排序(从大到小)。
2.2 多字段索引
多字段索引通常适用于需要根据多个字段进行查询的情况。在 MongoDB 中,可以通过 createIndex() 方法来创建多字段索引。
db.collection.createIndex({ name: 1, age: -1 })
以上语句将在集合中创建一个索引,按照 name 字段从小到大排列,然后按照 age 字段从大到小排列。这样我们就可以通过 name 和 age 字段来进行查询了。
2.3 TTL 索引
TTL 索引是一种过期索引,它可以自动删除在指定时间之前创建的文档。TTL 索引常用于缓存、日志、临时数据等应用场景。下面是 TTL 索引的创建方法:
db.collection.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 3600 } )
以上代码创建了一个名为 "expireAt" 的 TTL 索引,expireAfterSeconds 选项指定了文档的过期时间,单位为秒。
3. 索引的使用
虽然 MongoDB 可以自动利用索引提高查询效率,但是为了最大化的利用索引,还需要我们在程序设计中合理的利用索引来优化查询效率 。下文中,我们将介绍在 JavaScript 中如何使用索引。
3.1 使用 find() 函数
在 MongoDB shell 中,find() 函数是最常见的用于查询文档的函数。在使用 find() 函数时,若查询条件中包含索引键,则可以利用索引来优化查询效率。下面是一个使用 find() 函数的例子:
db.collection.find({ name: "John" })
以上代码查询 name 字段为 "John" 的所有记录,如果 name 字段上存在索引,则利用这个索引来提高查询效率。
3.2 使用 explain() 函数
explain() 函数能够让我们查看 MongoDB 是如何处理查询的。它不会返回查询结果,而是返回一个文档,告诉我们在执行查询时所涉及的索引、查询计划和查询花费的时间。对于复杂的查询,使用 explain() 函数来查看执行计划会非常有用。
db.collection.find({ name: "John" }).explain()
以上代码用文档实现了对 name 字段为 "John" 的查询,并使用 explain() 函数查看查询计划和索引情况。
4. 总结
索引是一种用于优化查询的数据结构,在大数据集下能够大大提高查询效率。MongoDB 中支持多种类型的索引,如单字段索引、多字段索引、全文索引等。对于复杂的查询,我们需要利用索引来提高查询效率,同时使用 explain() 函数来查看查询计划和执行情况。