数据库索引及其Big-O表示法

mik*_*kel 24 sql database sqlite indexing big-o

我试图用Big-O表示法来理解数据库索引的性能.我不知道太多,我猜:

  • 查询主键或唯一索引将为您提供O(1)查找时间.
  • 查询非唯一索引也会给出O(1)时间,尽管可能'1'比唯一索引慢(?)
  • 查询没有索引的列将提供O(N)查找时间(全表扫描).

这一般是正确的吗?查询主键会不会比O(1)表现更差?我特别关注SQLite,但我有兴趣了解不同数据库之间的差异程度.

Nic*_*rey 27

大多数关系数据库将索引结构化为B树.

如果表具有聚类索引,则将数据页存储为B树的叶节点.本质上,聚类索引成为表.

对于没有聚类索引的表,表的数据页存储在堆中.任何非聚集索引都是B树,其中B树的叶节点标识堆中的特定页面.

B树的最坏情况高度是O(log n),并且由于搜索取决于高度,因此B树查找的运行方式类似于(平均而言)

O(log t n)

其中t是最小化因子(每个节点必须至少有t -1个键,最多2*t*-1个键(例如,2*t*个子).

这就是我理解它的方式.

当然,不同的数据库系统可能会使用不同的数据结构.

当然,如果查询不使用索引,则搜索是对包含数据页的堆或B树的迭代.

如果使用的索引可以满足查询,则搜索会便宜一些; 否则,需要在内存中获取相应的数据页.


Mar*_*ins 6

索引查询(唯一查询或非唯一查询)通常为O(log n)。非常简单地说,您可以认为它类似于排序数组中的二进制搜索。更准确地说,它取决于索引类型。但是,例如,b树搜索仍然是O(log n)。

如果没有索引,则为O(N)。


gbn*_*gbn 5

如果您选择搜索的相同列,则

  • Primary 或 Unqiue 将是 O(log n):这是一个 b 树搜索
  • 非唯一索引也是 O(log n) + 一点:这是一个 b 树搜索
  • 无索引 = O(N)

如果您需要来自另一个“源”(索引交集、书签/键查找等)的信息,因为索引是非覆盖的,那么您可能有 O(n + log n) 或 O(log n + log n + log n)因为多个索引命中+中间排序。

如果统计数据显示您需要高百分比的行(例如,不是非常有选择性的索引),那么该索引可能会被忽略并变为扫描 = O(n)