具有日期字段的范围查询的查询性能

问题描述 投票:0回答:2

我正在寻找查询的性能优化。我的目标是查找所有在给定日期范围内的文档。馆藏很大,有超过600万份文件。因此查询如下:

db.collection.find({
    createdAt: {
        $gte: new Date('2018-06-19'), 
        $lt: new Date('2018-06-22')
    }
})

它运行了10分钟以上。是否有办法利用日期已排序的事实?我的意思是说,文档是在创建时插入的,因此每个超出范围的最后一个文档都将超出范围,但是mongo可能不知道,并会寻找那些日期已超出范围的文档??

mongodb indexing mongodb-query query-performance
2个回答
0
投票

MongoDB无法利用“事实”,因为它不知道存储了哪些二进制文档。

如果按非索引字段搜索,则Mongodb将执行COLLSCAN(解释为here

索引:

自v4.2起,MongoDB使用优化的构建过程,该过程仅在构建过程的开始和结束时才持有排他锁。

v4.2之前,您需要指定background选项

db.collection.createIndex({createdAt:1}, {background:true})

https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/#options-for-all-index-types


0
投票

应用程序及其用户正在寻找的是具有数百万个文档的集合的查询性能在几百毫秒(而不是10分钟)内。索引用于使这些查询快速运行。

通过在查找查询过滤器的日期字段上创建单个字段索引,可以使上述范围查询快速运行。索引存储索引键字段值和集合中文档的地址-这是少量数据。对于典型的集合,查询和索引,需要有效地使用(或适合)内存(称为工作集)中的集合数据和索引。运行查询时,将根据过滤条件然后访问相应的文档来访问索引。

[没有办法,如果不使用索引,则要处理数以百万计的文档,则无法使查询运行更快(请注意,对于成千上万的文档来说,这可能没有关系)。这可以在dev环境中用数百万个文档的样本集,查询过滤器字段上的索引和测试运行来实践证明。

用于执行此测试的工具正在生成query plan using the explainexplain method具有“ executionStats”模式,该模式提供诸如使用的索引(如果有),运行查询的时间,访问的索引键,返回的文档数,查询执行的各个阶段等详细信息。计划阶段将判断查询是否使用了索引。通常,使用索引运行的查询将显示索引扫描(IXSCAN),如果不使用索引,则将是集合扫描(COLLSCAN)。

创建的索引也可以与其他查询(如果适用)以及排序操作一起使用。此外,索引可以是复合索引(使用多个字段),并且可以与其他查询一起使用。

另请参阅FAQ: Indexes了解更多信息。由于您已经拥有大量收藏,请参阅Index Builds on Populated Collections以获取有关的注意事项。

db.collection.stats()命令可用于找到集合的大小和索引。

除了建立索引之外,仅投影必填字段也会影响您的查询性能。

© www.soinside.com 2019 - 2024. All rights reserved.