面试题答案
一键面试分析过程
- 按订单日期范围查询订单:
- 对于范围查询,在复合索引中,范围查询字段越靠前,索引的利用效率越高。如果按订单日期范围查询订单,order_date字段放在索引前面能更好地利用索引进行快速筛选。
- 按客户ID查询该客户的所有订单及其总金额:
- 这种查询属于等值查询,等值查询字段在复合索引中靠前能提高查询效率。所以customer_id字段在这种场景下放在索引前面较好。
- 兼顾两种查询场景:
- 由于范围查询对索引字段顺序更为敏感,并且在实际应用中,如果订单日期范围查询相对频繁,应该优先考虑满足订单日期范围查询的性能。
- 因此,复合索引字段顺序应该是
order_date
在前,customer_id
在后,total_amount
可以放在最后(因为它既不是范围查询字段也不是等值查询字段,在这两种查询场景中它主要是被返回的数据,而不是用于筛选的字段)。即创建复合索引为{order_date: 1, customer_id: 1, total_amount: 1}
。这里1
表示升序,也可以根据实际情况选择降序-1
,但一般升序在大多数场景下能满足需求。
结论
创建复合索引 {order_date: 1, customer_id: 1, total_amount: 1}
能较好地兼顾这两种查询场景的性能提升。