我试图用大O符号来理解数据库索引的性能.在不太了解的情况下,我猜:
- 查询主键或唯一索引将为您提供O(1)查找时间.
- 查询非唯一索引也会产生O(1)时间,尽管"1"可能比唯一索引(?)慢.
- 在没有索引的列上查询将提供O(N)查找时间(全表扫描).
这大体上是正确的吗?查询主键是否会产生比O(1)更差的性能?我特别关心SQLite,但我也很想知道不同数据库之间的差异有多大.
我试图用大O符号来理解数据库索引的性能.在不太了解的情况下,我猜:
这大体上是正确的吗?查询主键是否会产生比O(1)更差的性能?我特别关心SQLite,但我也很想知道不同数据库之间的差异有多大.
大多数关系数据库将索引 struct 为B树.
如果一个表有一个聚类索引,那么数据页将存储为B树的叶 node .从本质上讲,聚类索引变成了表.
对于没有聚类索引的表,表的数据页存储在一个堆中.任何非聚集索引都是B树,其中B树的叶 node 标识堆中的特定页面.
B-树的最坏情况高度是O(logn),由于搜索依赖于高度,B-树查找的运行方式大致如下(平均)
O(对数tn)
其中t是最小化因子(每个 node 必须具有至少t-1个密钥和最多2*t*-1个密钥(例如,2*t*个子 node ).
我就是这么理解的.
当然,不同的数据库系统很可能在幕后使用不同的数据 struct .
当然,如果查询不使用索引,那么搜索就是对包含数据页的堆或B树的迭代.
如果使用的索引能够满足查询,则搜索会稍微便宜一些;否则,需要后备来获取内存中的相应数据页.