MongoDB是一款非关系型数据库,它的查询性能在大规模数据下可以得到进一步的提升。下面我们将分享一条MongoDB数据库查询性能提高40倍的攻略,包含两个示例:
MongoDB 是支持索引的,但当查询的条件不是在索引的字段上时,就不能利用索引查询,这样查询效率会非常低下。如果想要在非索引字段上执行查询,请尝试创建相关的索引,使查询条件在索引字段上,并且需要注意索引的顺序。
示例1:
假设集合中存储了一些电商网站的销售数据,其中包含了商品ID(productId)、商品名称(productName)、所属类别(category)、商品单价(price)和销售日期(saleDate)等信息。现需要查询该网站2022年1月1日至2022年1月31日之间所有的销售额和销售量。
查询代码如下:
db.sales.aggregate([
{
$match: {
saleDate: {
$gte: ISODate('2022-01-01'),
$lt: ISODate('2022-02-01')
}
}
},
{
$group: {
_id: '$productId',
salesQty: { $sum: 1 },
salesAmount: { $sum: { $multiply: ['$price', '$qty'] } }
}
}
])
上述代码中,我们首先使用 $match 过滤条件,将销售日期范围限制在 2022 年 1 月 1 日至 2022 年 1 月 31 日之间,并按商品 ID 和销售日期进行分组,计算销售量和销售额。这个查询任务包含了 $match 和 $group 两个操作,都需要大量的计算资源。如果没有合适的索引,那么查询的耗时会很长。
为了优化该查询任务的性能,可以按照查询条件创建索引,代码如下:
db.sales.createIndex({ saleDate: 1, productId: 1 })
然后再次执行查询任务,您会发现查询结果的产生速度会快了很多。首先,MongoDB 可以根据索引查找符合查询条件的数据,这样效率更高,并且查询结果集也不会太大。在执行 $group 操作时,MongoDB 可以利用已经排序的数据,分组操作的速度比较快。
当我们需要复杂的过滤条件进行数据筛选时,查询的效率就会受到影响。在实际应用中,可以对数据进行适当调整,使查询尽可能简化。具体来说,我们可以使用更简单的过滤条件、避免使用复杂表达式或逻辑运算符、避免对空值或缺失值进行运算等。
示例2:
假设我们需要查询集合中年龄超过18岁的用户中,最近一次登录日期早于2021年5月1日的用户信息,查询代码如下:
db.users.find({
age: { $gt: 18 },
lastLoginDate: { $lt: ISODate('2021-05-01') }
})
上述代码中我们使用了两个过滤条件,一个是年龄 (age) 大于 18,另一个是最近登录时间 (lastLoginDate) 早于 2021 年 5 月 1 日。在执行该查询任务时,MongoDB 需要考虑两个字段的数据,并根据条件判断是否满足条件。尤其是日期比较上,在 MongoDB 中日期常常会被转换成 Unix 时间戳进行计算,这种计算方式通常会比较耗时。
为了提高查询效率,我们可以尝试规避日期、逻辑运算等复杂逻辑,改为按照年龄进行筛选,代码如下:
db.users.find({ age: { $gt: 18 } }).filter(user => {
return user.lastLoginDate < ISODate('2021-05-01')
})
上述代码中,我们首先使用 find 函数,按年龄筛选符合条件的用户,然后在结果集中进行过滤,返回最近一次登录日期早于 2021 年 5 月 1 日的用户,这样不仅简化了逻辑,同时也可以减少 MongoDB 的计算量,提高查询效率。
综上所述,通过优化查询条件和创建索引,可以让 MongoDB 的查询性能提高40倍,在实际使用中也可以遵循这些方法,提高 MongoDB 在大批量查询情况下的性能效率。
本文链接:http://task.lmcjl.com/news/18555.html