【问题标题】:Mongo - Is finding by _id alone (findById) faster than finding using _id and an indexed field to utilise an index?Mongo - 单独通过 _id (findById) 查找是否比使用 _id 和索引字段查找以利用索引更快?
【发布时间】:2020-04-28 05:07:52
【问题描述】:

我有一个奇怪的问题,似乎找不到答案。

我正在查询一个文档并且知道它的_id。到目前为止,我一直认为 findById 是最好的方法。

但是,我想知道如果我知道该文档位于一个索引中,这会大大缩小它的范围。我会更好地使用 _id 和其他具有特定索引的字段进行搜索吗?

示例 - 我知道它的“_id”,但我也知道它是“季节”,我们有按季节索引的集合

假设的方法

Model.findById().lean();

我好奇的方法可能更好?更快?

Model.findOne({ season: "", _id: "" }).lean();

我想知道的是季节索引会比仅使用 _id 的整个搜索更快地帮助我找到它

谢谢

丹尼尔

【问题讨论】:

    标签: jquery node.js mongodb


    【解决方案1】:

    技术上不是。

    MongoDB 使用B-tree 索引。

    B-tree 属性:

    Algorithm   Average     Worst case
    Space       O(n)        O(n)
    Search      O(log n)    O(log n)
    Insert      O(log n)    O(log n)
    Delete      O(log n)    O(log n)
    

    随着数据的增长,找出平均所需的时间。

    即使您创建的Compound Index{ season: 1, _id: 1 } 组成,索引也会首先按season 排序,然后在每个季节值内按_id 排序。

    【讨论】:

    • 你先说“索引按季节排序”。我以为索引已经排序了?例如,在搜索“季节”的索引时,您实际上只搜索一个像这样的小数组 [“2018”、“2019”、“2020”]。当您找到您的季节时,它就会嵌套所有特定的季节指针。 ??所以在这种情况下你的说法 findById 会更快?另外,我将阅读并理解 B-Tree 是什么。我可能已经在大学里做过这棵树了,但忘了,但我很快就跟不上了。需要更好地理解它
    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 2015-01-17
    • 2016-09-17
    • 2014-10-16
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多