1.首先介绍一下树三棵树
1)二叉排序树
找个例子来说,输入:
4 3 7 5 6 10 9
产生这样的搜索结构的话,当我们查找9,只用查找4次
会出现极端状态:如按序输入1-8
可见,使用二叉树当索引结构并不合适,I/O次数太多
2)B树(又叫B-树)
当我们想减少I/O次数,那就得减少树的高度,但是数据量恒定的情况下,高度减少意味着宽度得增加,从而引入B树的概念
以这个B树来看,节点可以容纳多个元素,高度为3,也就是最多I/O三次,从而找到想要的数据
3)B+树(MySql数据库索引使用的是B+树)
B+树是B树的一个变形,且数据都保存在叶子节点,其余节点仅保存地址
这是数据库索引使用的结构
以Mysql来说,一个节点默认可以存 16384b
而节点里面一个元素的大小为:14b=8b索引(如0016)+6b地址(箭头)
也就是说,一个地址节点可以存:16384/14=1170个元素
当数的高度为4,就能支持百万、千万的数据量
2.Mysql存储引擎
存储引擎是指定到表的
1)MyISAM:使用非聚集索引,索引文件和数据文件是分离的
2)InnoDB:使用聚集索引,索引文件和数据文件放在一起
总结:
InnoDB在叶子节点就可以直接取到数据,
MyISAM在叶子节点取到数据的地址,然后还要进行一个I/O操作,才能取到数据
因此,InnoDB的执行效率会高一点
3.常见面试题
1)为什么InnoDB表必须要有主键,我没设置主键也能新增成功呀?
InnoDB表需要组建B+树,当没有指定唯一索引的时候,会从左到右依次找,找到一列满足唯一索引条件的,用这一列来组建B+树;当没有符合条件的列的时候,会自己生成一个隐藏列,用来构建B+树;因此,InnoDB表最好自己指定主键。
2)为什么InnoDB表主键推荐使用int自增主键?
int类型容易比较大小。
举个反例:如果使用UUID当主键,那很难去比较大小,构造B+树很困难,而且会占用更多的空间
自增是为了让叶子节点从左到右依次递增,这样可以避免已经存满的叶子节点去列分,从而产生性能和空间的消耗。
3)为什么基本不用hash索引?
Mysql索引分为【B+树索引】和【hash索引】
B+树索引上面介绍了,这里聊聊hash索引,hash索引是把索引列经过hash算法进行关联,这里把col1当初索引列吧
select * from table where col1=1
hash是通过hash算法快速定位数据的,这里会把col1=1通过hash算法进行定位,所以时间复杂度是O(1),效率非常高。
那么问题来了,为什么效率这么高却没人使用,主要是:
select * from table where col1>1
出现这种范围查找,hash就跪了
还有hash不能避免全表扫描,数据量大检索效率低等问题
4)B+树是怎么实现范围查找的
B+树的叶子节点是从左到右依次递增的,而且各节点之间存在双向指针,可以很好的支持范围查找