如何优化带有日期约束mongodb `distinct`查询?

r8uurelv  于 2023-06-29  发布在  Go
关注(0)|答案(1)|浏览(126)

给定一个名为probe的集合,该集合每周增长1100万条记录,包含漏洞利用探测的记录,其中包括date属性和source.ip属性,即:

{
  _id: ObjectId('64943e2001000100160b843e'),
  date: '2023-06-22T12:27:12Z',
  source: {
    ip: '217.17.230.18',
    port: 56882
  },
  target: {
    ip: '88.198.64.58',
    port: 22
  }
}

哪种类型的索引将提高选择distinct source.ip的查询的性能,其中日期大于可变日期?ie(node.js):

export const recent = async (since) => (
  await client.db('cichlid').collection('probe').distinct(
    'source.ip',
    {
      date: {
        $gte: since.toISOString().replace('.000Z', 'Z')
      }
    }
  )
);

查询从API网关后面的AWSlambda运行,这将其限制为30秒超时。当前在集合上没有索引(除了自动创建的索引),并且随着集合大小的增长,它已经开始超时。

  • 我需要一个复合索引为这两个领域(datesource.ip)?
  • 我应该在date上创建一个简单的索引吗?
  • 我应该在source.ip上创建一个简单的索引吗?

compass给了我一个索引类型的选择(asc,desc,2dsphere,text)。由于日期过滤器通常是 *now()减去1小时 *,因此我假设desc适合该字段,text可能适合IP地址。但我只是猜测。

f87krz0w

f87krz0w1#

我创建了3个索引:

  • 化合物:date(desc)和source.ip(text)
  • simple:date(desc)
  • simple:source.ip(text)

compass显示仅使用简单日期(desc)索引。distinct source.ip查询从花费44秒完成变为500毫秒。我想这回答了问题。

在该特定情况下,索引需要在过滤器约束字段上,并且这将性能提高了88倍。

相关问题