面试题答案
一键面试-
字段顺序影响查询性能的原因:
- MongoDB在使用复合索引时,是按照索引字段的顺序依次匹配的。如果查询条件中字段的顺序与复合索引字段顺序不匹配,可能导致索引无法完全利用,甚至无法使用索引。
- 例如,假设有一个复合索引
{field1: 1, field2: 1}
,如果查询是{field2: "value2"}
,那么这个索引不会被使用,因为它需要先匹配field1
,而查询中没有field1
的条件。只有查询{field1: "value1", field2: "value2"}
或者{field1: "value1"}
这种以索引起始字段field1
开始的查询,索引才会起作用。
-
根据常见查询模式确定复合索引字段最佳顺序的示例:
- 示例一:范围查询与精确匹配
- 假设经常有这样的查询:查询某个部门(
department
)下年龄(age
)在一定范围的员工。例如查询department
为“销售部”且age
大于30的员工。 - 此时,最佳的复合索引顺序应该是
{department: 1, age: 1}
。因为先对department
进行精确匹配,能快速缩小数据范围,然后再对age
进行范围查询,索引可以充分发挥作用。如果索引顺序是{age: 1, department: 1}
,由于范围查询在前面,索引在范围查询后就无法很好地利用后续字段进行进一步筛选,查询性能会受影响。
- 假设经常有这样的查询:查询某个部门(
- 示例二:多字段精确匹配
- 若常见查询是根据员工的
first_name
和last_name
精确查找员工。例如查询first_name
为“John”且last_name
为“Doe”的员工。 - 这种情况下,
{first_name: 1, last_name: 1}
和{last_name: 1, first_name: 1}
在理论上都能支持查询,但一般将选择性高(不同值更多)的字段放在前面,假设last_name
的选择性更高,那么{last_name: 1, first_name: 1}
可能是更好的索引顺序,因为它能更快地缩小数据范围。
- 若常见查询是根据员工的
- 示例一:范围查询与精确匹配