MST

星途 面试题库

面试题:Python优化MongoDB复杂查询及索引策略调整

在一个具有大量文档的MongoDB数据库中,文档结构包含 'category'(分类)、'date'(日期)、'views'(浏览量)、'comments'(评论数)等多个字段。现在有一个复杂查询需求:查询最近一个月内,特定分类下,浏览量前10且评论数大于50的文档。请用Python的pymongo库实现该查询,并阐述如何通过分析查询计划来优化索引策略,以达到最佳性能。
13.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

Python代码实现查询

from pymongo import MongoClient
import datetime

# 连接MongoDB
client = MongoClient('mongodb://localhost:27017/')
db = client['your_database']
collection = db['your_collection']

# 计算最近一个月的日期
one_month_ago = datetime.datetime.now() - datetime.timedelta(days=30)

# 执行查询
result = collection.find({
    'category': '特定分类',
    'date': {'$gte': one_month_ago},
    'comments': {'$gt': 50}
}).sort('views', -1).limit(10)

for doc in result:
    print(doc)

分析查询计划优化索引策略

  1. 获取查询计划:在MongoDB shell中,使用explain()方法可以获取查询计划。例如:
db.your_collection.find({
    'category': '特定分类',
    'date': {'$gte': one_month_ago},
    'comments': {'$gt': 50}
}).sort('views', -1).limit(10).explain('executionStats')
  1. 分析查询计划
    • 扫描方式:关注executionStats.executionSuccess是否为true,若为false,表示查询执行失败。查看executionStats.executionStages中的stage字段,例如COLLSCAN表示全表扫描,IXSCAN表示索引扫描。全表扫描性能较差,应尽量避免。
    • 索引使用情况executionStats.executionStages.indexName字段显示使用的索引名称。若显示NULL,则表示未使用索引。
    • 排序操作executionStats.executionStages.inputStage中的sortPattern显示排序依据。若排序字段未在索引中,可能导致性能问题。
  2. 优化索引策略
    • 复合索引:根据查询条件,创建复合索引。例如,针对上述查询,可以创建categorydatecommentsviews字段的复合索引。在Python中使用create_index方法创建:
collection.create_index([('category', 1), ('date', 1), ('comments', 1), ('views', -1)])
- **索引顺序**:复合索引中字段顺序很重要。一般将选择性高(区分度大)的字段放在前面,对于范围查询字段(如`date`)紧跟其后,排序字段放在最后。这样可以最大程度利用索引提升查询性能。