面试题答案
一键面试查询语句
db.collection.find({}, {title: 1, price: 1, _id: 0})
优化性能原因
- 索引覆盖:由于
title
字段有单字段索引,如果查询仅涉及title
和price
字段,当price
字段大小相对较小且符合索引覆盖条件(索引包含了查询所需的所有字段)时,MongoDB可以直接从索引中获取这些数据,而无需再去磁盘读取文档的完整内容。这样大大减少了磁盘I/O操作。 - 减少网络传输:仅返回
title
和price
字段,不返回其他字段,减少了数据量,进而减少了网络传输的数据量。
索引无法覆盖查询的情况
- 增加磁盘I/O:如果索引无法覆盖查询,例如
price
字段不在索引中,MongoDB需要先从索引找到符合条件的文档指针,然后再根据指针从磁盘读取完整的文档数据,这就增加了磁盘I/O操作,降低了查询性能。 - 增加网络传输量:若返回的字段较多且索引无法覆盖,需要从磁盘读取更多数据,通过网络传输的数据量也会相应增加,导致网络压力增大,查询响应时间变长。