【问题标题】:Is the time complexity of querying an indexed column O(1)?查询一个索引列的时间复杂度是O(1)吗?
【发布时间】:2022-01-22 14:28:48
【问题描述】:

让我们假设表 A 有一个名为 X 的列,它是数字和索引的。

如果查询类似于:

find all rows where X is greater than some value

检索结果的时间复杂度是O(1)吗?

换句话说,表A 有100 万行还是100 亿行并不重要?

问题 2:

让我们假设表A 有另一个数字列Y,它是数字和索引的。

如果查询是现在:

find all rows where 
X is greater than some value
AND
Y is smaller than some value

此查询的时间是否是第一个查询的两倍?

【问题讨论】:

    标签: sql database mongodb database-design nosql


    【解决方案1】:

    这是一个非常模糊的问题,让我分解成几个案例。

    首先,没有什么是 O(1),无论您如何获取数据,您始终需要扫描与数据大小相关的复杂性。

    案例 1 - 不存在支持查询的索引。

    在这种情况下,无论您使用什么查询,Mongo 都会执行“集合扫描”,这意味着将检查集合中的所有数据以查看它是否与查询匹配。或者在复杂度方面 O(N)。这对于两个查询都是如此,因此总体而言复杂性是相同的。

    案例 2 - 存在满足两个查询 ({ x: 1, y: 1 } ) 的索引。

    在这种情况下,Mongo 将执行“索引扫描”,这意味着它将扫描索引树(btrees)而不是整个集合,给你一个对数复杂度,我不完全确定这个的确切复杂度因为这取决于 Mongo 选择编写这些东西的方式,但总体而言,查询 1 的 O(t log(n)) 应该是 O(t log(n))。因为复合索引嵌套了树索引,这意味着查询 2 的复杂性应该是相同的倍常数。

    现在我们可以回答这两个问题了:

    换句话说,表 A 有 100 万行还是 100 亿行并不重要?

    显然,无论规模大小,每次搜索的时间复杂度都是相同的,但在现实生活中,即使比率相同,这也非常重要,因为 O(1M) != O(1B)。

    这个查询会花费第一个查询的两倍吗?

    这有点难以回答,我认为它比其他任何事情都更依赖于规模,对于案例 1(colscan)和较小的规模,它可能会在大约同一时间运行。回答这个问题的最佳方法是运行您自己的与您的用例相匹配的基准测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 2019-10-08
      • 2017-09-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      相关资源
      最近更新 更多