索引
MongoDB 支持建立索引,索引可以建立在一个或者多个字段上。并且由于索引是在内存中的,所以查询效率很高。但是在写操作时,由于还需要维护索引,所以写操作的效率会有所降低。
MongoDB 索引的数据结构是 B 树。
索引覆盖查询
索引覆盖查询就是之间在索引上查询并返回结果,不需要在磁盘上扫描结果。索引覆盖查询需要满足以下条件:
- 索引字段包含了查询条件中的所有字段。
- 查询条件中只包含索引字段,不包含其他字段。
- 查询结果只需要索引字段的值,不需要其他字段的值。
1 | // users有三个字段name,gender,email |
对于索引覆盖查询来说,不会去数据库文件中去查找,而是在索引中直接提取数据。
关系
在 MongoDB 中,可以表示一对一、一对多、多对一、多对多关系。
对于一对多关系,可以有两种方法:
- 嵌入完整的文档:在更新时需要非常的小心,需要同时更新所有嵌入的完整文档。同时冗余数据多,数据量不断变大,会影响读写性能。
- 关系引用:通过引用文档的 _id 字段来建立关系。也就是说,MongoDB 支持在文档中引用其他文档。
引用
在 MongoDB 中,数据库引用有两种方式:手动引用和DBRefs。
手动引用就是直接去在对应的字段中记录 _id 信息。
DBRefs 的形式为 { $ref : , $id : , $db : }
。三个字段表示的意义如下:
- $ref:集合名称。
- $id:引用的 _id。
- $db:引用的数据库名称,可选参数。
因为 DBRefs 可以指定引用的 id 和数据库名称,所以更加相比于手动引用更加规范和灵活。