1. MongoDB索引简介
MongoDB是一个高效且易于扩展的NoSQL数据库。其中一个核心优势是对索引的支持。在MongoDB中,索引用于加快数据访问速度,加快查询速度,提高应用程序性能。索引缓存了数据的一部分,并将其保存在内存中,从而大大减少了访问磁盘的次数。
MongoDB中的索引使用B-tree数据结构。它在节点上实现了排序。为了避免不必要的索引扫描,必须确保编写的查询优先使用索引。
2. MongoDB索引类型
2.1 单键索引
单键索引最常见的类型就是普通索引了。MongoDB中,如果没有为查询字段定义索引,MongoDB会自动为该字段创建普通索引。应该尽可能少地使用这种类型的索引,因为它会在磁盘上占用大量的存储空间,而且查询运行也很慢。
db.collection_name.ensureIndex( { field: 1 } )
当查询中涉及的字段很少时,普通索引可以提高性能。下面是如何可以使用单键索引来加快查询:
db.collection_name.find( { field: value } )
2.2 多键索引
多键索引可以定义在包含数组的字段上。它与单键索引的最大不同是,具有多个键的值可以在同一个索引键上查询。这种类型的索引可以极大地提高查询性能。
db.collection_name.ensureIndex( { "array_field": 1 } )
以下查询语句只会触发一次索引:
db.collection_name.find( { "array_field": x } )
2.3 文本索引
文本索引允许您对文本数据进行全文查询。这种类型的索引将数据拆分成单词,因此呈现不同单词的字段可以支持文本搜索。文本索引适用于大量文档,例如大型文本文档、博客文章、新闻报道等。
db.collection_name.ensureIndex( { field: "text" } )
3. MongoDB索引调整大小
索引大小是MongoDB查询性能关键因素之一。索引对于MongoDB运行来说,是非常重要的,因为它可以大大提高查询的效率。索引保留在内存中,并且尽可能避免在磁盘上进行访问。
3.1 MongoDB索引的大小
MongoDB的索引大小通常比实际存储数据的大小要小。当索引大于内存时,MongoDB会尝试将其调整为较小的大小。然而,如果尝试调整索引大小失败,MongoDB将在磁盘上存储索引。
3.2 MongoDB索引大小调整
可以通过配置MongoDB的存储引擎、增加服务器内存容量或增加磁盘空间来调整索引大小。然而,如果这些选项不可行,您可以执行以下步骤来调整索引的大小:
3.3 重新建立索引
重新建立索引可以帮助MongoDB更好地对查询响应,其中之一就是其可调整性。如果数据集很大,并且索引尺寸已经超出了服务器内存容量,那么可以使用重建索引的方法在调整大小时释放内存。重建索引的方式是在建立索引时增加uniqueIndex参数。
db.collection_name.createIndex( { field_name: 1 }, { background: true, unique: true} )
3.4 避免索引使用
为什么要避免索引使用?因为索引会占用很多服务器内存。MongoDB没有提供任何方法来精确地衡量索引使用量,但可以使用诊断方法,如mongostat和MMS。如果确定索引使用量超出了预算,就需要针对其中一些查询建立索引。
3.5 压缩索引
压缩索引的方法是在编辑过的索引上运行db.collection.reIndex()命令。由于mongod使用删除后空缺的方式,这个命令将使索引尺寸缩小,因为它会删除大量不用的空间。
3.6 删除不必要的索引
删除不必要的索引可以显著提高查询性能。当你不得不删除索引时,你甚至可以使用count()函数来检测哪些索引不被使用。请谨慎检查结果,以避免将必要的索引删除。
4. MongoDB索引最佳实践
4.1 最佳实践1:索引设计应该考虑查询场景
索引的存在是为了提高数据访问速度。因此,必须考虑到查询场景。在设计索引时,需要考虑到如下问题:
读取集合数据的各种查询操作,例如范围查询、等于查询、比较查询、LIKE查询、全文搜索等,要确定哪些查询需要索引支持
索引需要覆盖哪些查询条件,包括键的数量和其他条件,这些条件确保了查询的速度和准确性
统计查询应该考虑使用哪些索引,这使得Aggregation查询更快更有效
4.2 最佳实践2:避免全集合索引
这是一个常见的错误,在MongoDB中全集合索引将无法发挥其应有的作用,而且会浪费大量的内存和系统资源。相反,优先使用复合索引和部分索引。
4.3 最佳实践3:避免创建过多的索引
过多的索引会导致验证、维护和查询效率低下。适当的索引个数将有助于提高响应时间和可伸缩性,同时降低存储成本。
4.4 最佳实践4:创建复合索引
如果您的查询需要同时使用多个字段,请使用MongoDB复合索引,而不是单键索引。复合索引是指使用多个字段作为查询条件的索引。使用复合索引可以显著提高查询性能。
4.5 最佳实践5:保护容量的同时注意性能
当容量达到极限时,调整索引可以帮助降低存储和计算成本。但是,我们必须注意其对性能的影响。建议定期检查索引的大小和容量,以确保它们符合设计要求。