面试题答案
一键面试性能分析
- 索引情况:现有索引为
(age, city)
复合索引。此索引对于age
和city
联合查询有较好性能,但是对于age
或salary
的查询,这个索引无法完全利用。 - 查询分析:查询条件是年龄大于40岁或者薪资大于50000。由于
or
操作符连接了两个字段(age
和salary
),而索引仅包含age
和city
,MongoDB 无法有效地使用该索引,查询可能需要全集合扫描,性能较差。
优化建议
- 不能通过现有索引优化原因:现有索引只涉及
age
和city
,而查询中salary
字段无法利用该索引。同时or
操作符的使用也使得单一的(age, city)
索引难以发挥作用。 - 可能的解决办法:
- 添加复合索引:可以考虑添加
(age, salary)
或(salary, age)
的复合索引。这样在查询age > 40
或者salary > 50000
时,至少部分条件可以利用索引。例如添加(age, salary)
索引,当查询age > 40
时可以利用索引前缀,如果查询salary > 50000
,虽然不能完全利用此索引,但对于年龄相同的文档,在匹配年龄后对薪资过滤会快一些。 - 覆盖索引:如果查询只涉及
age
、salary
及少量其他字段,可以创建覆盖索引。例如(age, salary, name)
,这样查询不仅可以利用索引查找数据,还可以直接从索引中获取部分所需字段,减少回表操作,提高性能。
- 添加复合索引:可以考虑添加
总结来说,当前查询在现有索引下性能不佳,需要通过添加与查询条件匹配的新索引来优化性能。