【发布时间】:2021-06-07 08:29:52
【问题描述】:
在 MySQL InnoDB 或许多其他数据库引擎中,主键是通过聚集索引实现的。但是使用二级索引搜索后,引擎必须使用二级索引中提供的主键查找聚集索引(如果没有覆盖索引)。
InnoDB 使用 B+ 树作为其聚集索引,它是一个搜索复杂度为O(log n) 的结构,因此我们可以将过程总结如下:
- 使用聚集索引:
一次通过,费用
O(n)。 - 使用二级索引:
两通。第一次通过花费
O(log n)一个结果在m记录中。那么对于每个m记录,第二遍花费O(log n),因此时间复杂度将为m*O(log n)。
我知道在使用hasing时,搜索的时间复杂度可以降低到O(1),所以我想知道为什么这些数据库引擎更喜欢使用B+树而不是hasing技术(例如构建一个KV存储)?是因为记录存储在磁盘上而不是内存中吗?
同时,我还有一个问题,其他一些数据库,比如 RocksDB,使用 KV 存储而不是 B+ 树。他们为什么使用它?
编辑
我想让这个问题更清楚。我发现很多表格都是用auto incrementPK设计的,而不是使用具有实际意义的东西,比如电话号码或IP。所以B+树的优势没有得到充分发挥。例如,B+树擅长在范围内搜索数据,但我在范围内搜索auto incrementPK在实践中很少见。
【问题讨论】:
-
散列并不比 BTree 快得多;为什么没有充分的理由实施哈希? (我正在阅读原始实施者的想法。)
-
我猜如果你在 MySQL 中对不是
auto increment值的特定列值(例如string或double)使用索引,MySQL 仍将使用 B-trees那个。
标签: mysql database indexing innodb