MST

星途 面试题库

面试题:MongoDB索引与查询优化在复杂业务场景下的应用

假设你在一个电商系统中,订单集合`orders`包含字段`customer_id`、`order_date`、`product_ids`(数组类型,包含订单中的商品ID)、`total_amount`。业务需求是查询最近一个月内,特定客户(`customer_id`已知)购买了某特定商品(`product_id`已知)且订单总金额大于某个阈值(例如1000)的订单记录。这个查询涉及范围查询、数组查询以及条件过滤,在考虑索引优化的情况下,如何设计索引以实现最佳查询性能?请详细说明索引设计思路、创建索引的语句,并分析查询执行计划以验证索引是否有效。
38.9万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

索引设计思路

  1. 复合索引:由于查询涉及到customer_idorder_dateproduct_idstotal_amount多个条件,创建一个复合索引可以有效覆盖这些查询条件。
  2. 索引顺序:索引字段顺序应该根据查询条件的选择性和使用频率来确定。customer_idproduct_id是精确匹配条件,放在前面;order_date是范围查询,放在中间;total_amount是条件过滤,放在最后。这样的顺序有助于提高索引的使用效率。

创建索引的语句

假设使用的是MySQL数据库,创建索引的语句如下:

CREATE INDEX idx_customer_product_date_amount 
ON orders (customer_id, product_ids, order_date, total_amount);

查询执行计划分析

  1. 使用EXPLAIN关键字:在MySQL中,可以使用EXPLAIN关键字来查看查询执行计划。例如:
EXPLAIN SELECT * 
FROM orders 
WHERE customer_id = [specific_customer_id] 
  AND product_ids IN ([specific_product_id]) 
  AND order_date >= CURDATE() - INTERVAL 1 MONTH 
  AND total_amount > 1000;
  1. 分析执行计划结果
    • key:如果显示为idx_customer_product_date_amount,说明索引被正确使用。
    • key_len:显示了索引使用的字节数,通过该值可以判断索引是否被完全利用。
    • ref:显示了使用索引进行查询时,哪些列或常量与索引进行了比较。
    • rows:估计需要扫描的行数,该值越小,说明查询性能越好。

通过分析执行计划,可以验证索引是否有效,并且根据实际情况对索引进行调整优化。