面试常见问题(必知必会)之数据库索引(三)为什么建议InnoDB表使用自增主键?(数据库索引的另一种存储方式Hash表)

为什么建议必须建主键和使用整型做主键请看上一篇《数据库索引(二)》最后的面试题部分。该篇主要讨论为什么要用自增主键。

但是在讨论为什么之前,我们先来看个东西

在这里插入图片描述

通过上图我们可以看出,数据库创建存储索引的方法除了B+Tree之外还有一种方法是Hash表。那么,先来看一下Hash表的结构:

在这里插入图片描述

那么它是怎么存储的呢?比如,现在有一张如上图的表,我想把col3那一列作为索引利用Hash进行存储。那么,数据库会将col3中的每个值进行Hash运行,如下图最左边部分,算出一个值以后它就将那个值进行保存,这个值对应的就是索引值及其所在行的磁盘空间地址。(它就类似于一个数组加一个链表)

在这里插入图片描述

查找过程:它会将你要查找的值先直接进行hash计算,然后直接进入桶内进行快速定位到对应的hash散列值,进而定位到索引和其所在行的磁盘空间地址,然后直接进入磁盘文件直接定位对应行数据。很多时候Hash索引要比B+Tree索引更高效。
 
 
Hash索引这么快,为什么数据库几乎所有的场景都是使用B+Tree来使用索引呢?

  • Hash索引仅能满足"=",“IN”,不支持范围索引。例如,查找大于某个值的所有记录,Hash只能定位到某个值的位置,至于大于它的值在哪儿没办法查到,就只能全表遍历了。而B+Tree是满足的,同样是查找大于某个值的所有记录,如下图,B+Tree快速定位该值索引后,因为叶子结点从左到右是依次递增且两个叶子节点之间有双向指针。就可以快速的通过该值索引快读获取大于该值的所有索引及相关数据。

在这里插入图片描述

  • hash冲突问题
     
     

回到最开始问题,为什么使用自增主键?

因为B+Tree保存的时候,它是从左到右递增维护的。如果不使用递增主键,它就会往中间某个节点插入索引,但是该节点已经满了,它就会分裂节点甚至平衡整个B+Tree,这个过程就会很耗费性能。那么,如果使用自增主键,就是一直往最后插入索引,只有该节点索引已满才会到新建下个节点继续保存索引。不会造成分裂和平衡树结构的过程也就不会有过多的性能耗费。

。不会造成分裂和平衡树结构的过程也就不会有过多的性能耗费。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值