MST

星途 面试题库

面试题:MongoDB索引覆盖与投影优化查询性能

在MongoDB集合中有大量文档,文档包含多个字段。现在需要执行一个查询,仅返回`title`和`price`字段,同时要求尽可能减少磁盘I/O和网络传输。已知`title`字段上已有单字段索引,你如何利用索引覆盖来优化这个查询?写出查询语句并详细说明为什么这样可以优化性能,以及如果索引无法覆盖查询会出现什么情况。
28.2万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

查询语句

db.collection.find({}, {title: 1, price: 1, _id: 0})

优化性能原因

  1. 索引覆盖:由于title字段有单字段索引,如果查询仅涉及titleprice字段,当price字段大小相对较小且符合索引覆盖条件(索引包含了查询所需的所有字段)时,MongoDB可以直接从索引中获取这些数据,而无需再去磁盘读取文档的完整内容。这样大大减少了磁盘I/O操作。
  2. 减少网络传输:仅返回titleprice字段,不返回其他字段,减少了数据量,进而减少了网络传输的数据量。

索引无法覆盖查询的情况

  1. 增加磁盘I/O:如果索引无法覆盖查询,例如price字段不在索引中,MongoDB需要先从索引找到符合条件的文档指针,然后再根据指针从磁盘读取完整的文档数据,这就增加了磁盘I/O操作,降低了查询性能。
  2. 增加网络传输量:若返回的字段较多且索引无法覆盖,需要从磁盘读取更多数据,通过网络传输的数据量也会相应增加,导致网络压力增大,查询响应时间变长。