面试题答案
一键面试查询语句
在MongoDB中,查询语句如下:
db.orders.find({
$and: [
{ "items.product": { $not: { $eq: "Apple" } } },
{ "total_amount": { $gt: 15 } }
]
});
not操作符对查询性能的影响
- 索引使用受限:
not
操作符通常不能有效地利用索引。因为索引是基于特定值的查找优化的,而not
操作需要遍历更多的数据来排除不符合条件的文档,导致全表扫描的可能性增加,性能显著下降。 - 逻辑判断复杂:数据库需要对每个文档进行复杂的逻辑判断,不仅要判断字段值是否不等于指定值,还要结合其他条件判断,增加了计算资源的消耗。
优化思路
- 复合索引:创建复合索引,例如
db.orders.createIndex({ "items.product": 1, "total_amount": 1 })
。这样可以让数据库在遍历索引时,更快地筛选出符合条件的文档,减少全表扫描的概率。 - 反查优化:将
not
条件转化为正向条件。例如,如果可能,找到所有购买了除Apple以外产品的条件,而不是直接使用not
排除Apple。 - 分阶段查询:先使用正向条件查询出一部分结果,再在内存中过滤掉不符合
not
条件的文档,减少数据库的压力。