我对数据库很陌生,所以如果这是一个愚蠢的问题,请原谅我。
在现代数据库中,如果我使用索引来访问行,我相信这将是O(1)复杂性。但是如果我进行查询以选择另一列,它会是O(1)还是O(n)?数据库是否必须遍历所有行,还是为每列构建排序列表?
答案 0 :(得分:23)
实际上,我认为基于索引的访问将是O(log(n)),因为您仍然会通过B-Tree-esque组织搜索到达您的记录。
答案 1 :(得分:7)
要回答您的文字问题,如果列上没有索引,则数据库引擎必须查看所有行。
在更有趣的情况下,通过多列选择(包括索引和不使用索引),情况变得更加复杂:如果查询优化器选择使用索引,那么它将首先根据索引选择行,然后应用具有剩余约束的过滤器。从而将第二过滤操作从O(行数)减少到O(按索引选择的行数)。这两个数字之间的比率称为选择性,是选择使用哪个索引时的重要统计数据。
答案 2 :(得分:4)
索引是每列的,因此如果在未索引的列上使用where子句,它将执行所谓的tablescan,即O(n)。
答案 3 :(得分:3)
我不知道答案,但请记住,big-O表示法只能为您提供任意大的数据集大小的性能指示。
例如,数据库性能的瓶颈通常是磁盘搜索。因此,如果工作数据集可以保存在内存中,则性能会大大提高。 Big-O表示法不会告诉您有关此类优化的任何信息,因为它们仅与有限数据集相关。
答案 4 :(得分:1)
B树不会产生O(logN),这是二叉树的复杂性。
组织B树,使得每个节点具有整个块,因此一旦找到节点,单个I / O操作就可以读取整个块。
每个节点的项目数=阻塞因子(#records / block){bfr},B树优化搜索将产生O(log bfr÷2 +1 N)I / O操作而不是按键搜索记录的O(N)I / O操作。
答案 5 :(得分:0)
你有索引。聚簇索引在磁盘上进行物理排序,每个表只能有一个。非聚簇索引在逻辑上是排序的,您可以拥有其中的许多(注意不要滥用它,它可能会减慢写入操作)。 如果您的列上没有索引,那么我相信这是一个很好的旧行逐行方法。
答案 6 :(得分:0)
有不同类型的索引,不同的执行计划和不同数据库的不同实现。大多数关系数据库代码都在搜索优化算法中。你的问题没有一个答案。当您想知道如何执行查询时,可以使用工具可视化执行计划。