Skip to content

索引的本质是什么?

cxuan edited this page Sep 20, 2020 · 2 revisions

索引的本质就是一种支持快速查找的数据结构 ,不一定是b+树,也可以是hash索引,也可以是b树,二叉树 数组 n叉树等等

b+树只是一种均衡各方面的产物,hash是可以快速查找,效率为o(1),插入新增都快,缺点在于无法很好的支持范围查找

有序数组 ,可以快速查找,效率是二分法的效率, 也有效支持范围查找, 缺点是插入要移动数据,对插入不友好

二叉树,可以快速查找,范围查找,快速增删,缺点是分叉少,会导致树太高,树高则查找次数变多

均衡各方面之后,才有了b+树,b+树是一个n叉树,树高不超过3, 每个节点可以有1200个叉

可以有效支持,快速查找,快速增删,极少io,因为根节点总在内存中,因此最多只需要访问3次磁盘 就可以把数据所在的块定位到

还有 b b+ b* 有三种

b*树在b+树基础上进行了优化,优化了b+树页分裂导致空间利用率减半的问题

b树,是n叉树,所有数据只在节点上出现一次,搜索可以在非叶子节点结束。每个节点的最大子节点数是m,最小是m的一半, 如果新增数据时该节点上的子节点数量大于m,就要将该节点分成两个节点,每个节点下的子节点数都是原来的一半,这个过程叫页分裂

b+树,在b树的基础上 对查找效率进行了优化,所有数据都挂在叶子节点,所有非叶子节点都是叶子节点的索引, 在叶子节点处,各个叶子节点通过指针跟旁边的节点关联,即叶子节点就是存储的数据

b*树,解决页分裂的问题,非叶子节点的兄弟节点之间也通过指针相连,构成链表,如果节点上的子节点满了,就将它的子节点挪一部分到旁边没满的兄弟节点上,避免了重新创建新的节点的过程

Clone this wiki locally