面试题答案
一键面试优化查询语句
- 投影优化:只选择需要的字段,减少数据传输量。例如,若只需
name
和age
字段,查询语句为db.collection.find({ /*查询条件*/ }, { name: 1, age: 1, _id: 0 })
,_id
默认返回,不需要可设置为0
。 - 条件顺序:将选择性高的条件放在前面,即那些能快速过滤掉大量数据的条件。例如,若某个字段大部分文档中值都很独特,先按该字段匹配,如
db.collection.find({ uniqueField: "specificValue", otherField: { $gt: 100 } })
。
索引策略
- 复合索引:根据查询条件创建复合索引。若查询包含
field1
的范围查询和field2
的字段匹配,创建复合索引db.collection.createIndex({ field1: 1, field2: 1 })
。索引字段顺序很重要,范围查询字段在前,精确匹配字段在后。 - 覆盖索引:确保索引包含查询所需的所有字段,这样查询结果可直接从索引中获取,无需回表操作。例如,查询
db.collection.find({ field1: "value1", field2: { $gt: 10 } }, { field3: 1, _id: 0 })
,创建索引db.collection.createIndex({ field1: 1, field2: 1, field3: 1 })
。
利用分片特性
- 分片键选择:确认查询条件中的字段是否与分片键相关。若部分查询条件基于分片键,查询可直接定位到相关分片,减少跨分片查询。例如,若按
user_id
分片,查询db.collection.find({ user_id: "12345", status: "active" })
,可快速定位到特定分片。 - 平衡负载:确保分片集群负载均衡。定期检查分片状态,使用
sh.status()
命令查看各分片的数据量和负载情况。若发现不均衡,可手动触发平衡操作sh.rebalanceDatabase("databaseName")
,保证查询时各分片能高效处理请求。