MongoDB查询1M数据慢
MongoDB slow to query 1M data
首先对我的英语感到抱歉。
目前我的项目有100万聊天记录。
所以我想从 mongodb 中查询 Chats
集合,但是查询需要时间,有时需要 100% 的 cpu。所以我想知道如何优化查询。
经过我的研究,也许它应该使用 index
和 lean()
,但我不清楚如何将其用于我的数据。
我的 Chat
数据如下所示
{
"_id" : ObjectId("602c53cad1dc22359729bb62"),
"textMessage" : "1",
"imageNames" : [],
"uuid" : "a9y10mfqtokl8mtk0l",
"sendBy" : "a9y10m9s2skkwu564g",
"sendTo" : "a9y10m9s2skkwvo7xl",
"createDateTimestamp" : 1613517770901.0,
"__v" : 0
}
这里是我的查询函数
Promise.all([
UserModel.findOne({ uuid: selfUuid }).lean(),
UserModel.findOne({ uuid: chatWithUuid }).lean(),
Chat.find({
$or: [
{ sendBy: uuid, sendTo: chatWithUuid },
{ sendBy: chatWithUuid, sendTo: uuid },
],
})
.lean()
.sort({ createDateTimestamp: -1 })
]).then((result) => {
const selfUser = result[0]
const chatWithUser = result[1]
const chatMessages = result[2]
const responseData = chatMessages.map(({ sendBy, sendTo, ...props }) => {
if (sendTo === selfUser.uuid) {
return {
...props,
sendTo: selfUser,
sendBy: chatWithUser,
}
} else {
return {
...props,
sendTo: chatWithUser,
sendBy: selfUser,
}
}
})
response.success(res, responseData)
}).catch((e) => {
response.fail(res, e, 'fail to getSingleChat')
})
根据您的查询函数和模型,您可以创建以下两个索引来加快搜索速度:
1) {uuid:1}
2) {sendBy:1,sendTo:1}
如果您在 mongodb 中为 createDateTimestamp 的集合提供索引。您不再需要 .sort({ createDateTimestamp: -1 })。
首先对我的英语感到抱歉。
目前我的项目有100万聊天记录。
所以我想从 mongodb 中查询 Chats
集合,但是查询需要时间,有时需要 100% 的 cpu。所以我想知道如何优化查询。
经过我的研究,也许它应该使用 index
和 lean()
,但我不清楚如何将其用于我的数据。
我的 Chat
数据如下所示
{
"_id" : ObjectId("602c53cad1dc22359729bb62"),
"textMessage" : "1",
"imageNames" : [],
"uuid" : "a9y10mfqtokl8mtk0l",
"sendBy" : "a9y10m9s2skkwu564g",
"sendTo" : "a9y10m9s2skkwvo7xl",
"createDateTimestamp" : 1613517770901.0,
"__v" : 0
}
这里是我的查询函数
Promise.all([
UserModel.findOne({ uuid: selfUuid }).lean(),
UserModel.findOne({ uuid: chatWithUuid }).lean(),
Chat.find({
$or: [
{ sendBy: uuid, sendTo: chatWithUuid },
{ sendBy: chatWithUuid, sendTo: uuid },
],
})
.lean()
.sort({ createDateTimestamp: -1 })
]).then((result) => {
const selfUser = result[0]
const chatWithUser = result[1]
const chatMessages = result[2]
const responseData = chatMessages.map(({ sendBy, sendTo, ...props }) => {
if (sendTo === selfUser.uuid) {
return {
...props,
sendTo: selfUser,
sendBy: chatWithUser,
}
} else {
return {
...props,
sendTo: chatWithUser,
sendBy: selfUser,
}
}
})
response.success(res, responseData)
}).catch((e) => {
response.fail(res, e, 'fail to getSingleChat')
})
根据您的查询函数和模型,您可以创建以下两个索引来加快搜索速度:
1) {uuid:1}
2) {sendBy:1,sendTo:1}
如果您在 mongodb 中为 createDateTimestamp 的集合提供索引。您不再需要 .sort({ createDateTimestamp: -1 })。