Mongodb 索引

索引操作

前面学习过 MySQL,我们知道数据库里给数据构建索引通常能够极大的提高数据查询的效率,缩短查询耗时,如果没有索引,数据库在查询数据时必然会扫描数据表中的每个记录并提取那些符合查询条件的记录。同理,在 MongoDB 中构建索引也可以提高数据的查询效率和缩短查询耗时,没有索引的情况也是一样,MongoDB 也会再查询数据时扫描集合中的每个文档并提取符合查询条件的文档。这种扫描全集合的查询效率是无疑是非常低下的,特别在处理大量的集合数据时,查询时间可能会达到几十秒甚至几分钟,这对用户体验来说是非常致命的。

文档:https://docs.mongodb.com/manual/indexes/#default-id-index

注意事项

  1. MongoDB 的索引是存储在运行内存(RAM)中的,所以必须确保索引的大小不超过内存的限制。如果索引的大小超过了运行内存的限制,MongoDB 会删除一些索引,这将导致性能下降。

  2. MongoDB 的索引在部分查询条件下是不会生效的。

    • 正则表达式及非操作符,如 $nin,$not,等。

    • 算术运算符,如 $mod,等。

    • $where 自定义查询函数。

  3. 索引会在写入数据(添加、更新和删除)时重排,如果项目是写多读少,则建议少使用或者不要使用索引。

  4. 一个集合中索引数量不能超过 64 个。

  5. 索引名的长度不能超过 128 个字符。

  6. 一个复合索引最多可以有 31 个字段。

  7. Mongodb 索引统一在 system. Indexes 集合中管理。这个集合只能通过 createIndex 和 dropIndexes 来操作。

MongoDB 默认会为插入的文档生成 _id 字段(如果应用本身没有指定该字段),_id 是文档唯一的标识,为了保证能根据文档 _id 快速查询文档,MongoDB 默认会为集合创建 _id 字段的主键索引

查询分析

与 SQL 语句类似,MongoDB 也提供了一个 explain,供开发者进行查询分析。

explaing 的使用有个参数,分别是:queryPlanner、executionStats、allPlansExecution,默认是 queryPlanner,开发中常用的是 executionStats。。

db.orders.find(["title":"商品购买-10"}).explain("executionStats");

创建索引

MongoDB 支持多种类型的索引,包括普通索引(单列索引)、复合索引、多列索引、全文索引、哈希索引、地理位置索引

等,每种类型的索引有不同的使用场合和业务场景。另外,还有一种叫索引,索引本质上就是普通索引。另外,MongoDB 的全文索引很弱智,如果真要用在开发中,还是建议使用 elasticsearch 或者 Sphinx。

image-20220713162314854

image-20220713162354390

image-20220713162422725

image-20220713162503191

删除索引

MongoDB 给文档主键 id 默认创建单字段索引是无法删除的。

//删除单个索引 
db.集合.dropIndex('索引名称")

//删除当前集合下除了 id 主键索引以外的所有索引,慎用
db.集合.dropIndexes()