MongoDB查询1M数据慢

MongoDB slow to query 1M data

首先对我的英语感到抱歉。

目前我的项目有100万聊天记录。 所以我想从 mongodb 中查询 Chats 集合,但是查询需要时间,有时需要 100% 的 cpu。所以我想知道如何优化查询。

经过我的研究,也许它应该使用 indexlean(),但我不清楚如何将其用于我的数据。

我的 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 })