【MySQL45讲】day3. 深入浅出索引(上)

一、索引数据结构的常见模型

        索引的常见模型有很多,比较常见的有三种:哈希表、数组、树。

        哈希表:哈希表是一种以Key-Value存储数据的数据结构,我们只需要输入key,就可以查询到对于的value。其实现的思路很简单:其实就是用一个数组存储数据,首先我们输入key,通过哈希算法得到对应的值,把这个值当成数组的下标,这样在下次查询的时候需要花费O(1)的时间。但在哈希的过程中可能会产生哈希碰撞,也就是说,两个不同的key经过哈希算法得出了相同的值,那么比较常见的解决方法就是链地址法,把这个结点变成链表,发生冲突的元素往这个链表后面加就好。通过哈希表构建的索引有个问题就是没办法范围查询,因为哈希计算出来的值不是有序的,我们使用哈希表构建索引的情况一般就是用在key-value这种情景下或者nosql中。

        数组:相比哈希表,数组可以是顺序存储的,这样可以满足范围查询,不过数组也有一个问题,就是虽然数组在查询的效率上很高,不过进行更新时,如果要插入一个元素,那么这个元素后边的所有元素都需要向后挪,这使得每次更新的成本很高。

        树:比较常见的二叉搜索树、B树、B+树,使用二叉树的话,在大数据量的情况下会导致层级过高,查询效率降低。所以我们选用n路树,Innodb这里选用的是B+树,Innodb中B+树的特点数据都放在叶子节点,非叶子结点只存储指针,同时叶子节点之间构建了双向链表,相比B树,B树的非叶子结点不仅有指针,还有数据,这样会导致在相同数据量的情况下,B树的层级要比B+树高,所以为了查询效率,Innodb默认为B+树。

二、索引类型

        按照存储结构来分:聚集索引和二级索引。通常情况下主键为聚集索引,其他类型的索引(普通索引、非空索引、全文索引)为二级索引。当没有主键和没有合适当聚集索引的列时,这时候mysql会创建一个隐式的列(row_id)当聚集索引。

        按照类别划分:主键索引、常规索引、非空索引、全文索引。

三、索引维护

        B+树为了维护索引的有序性,每次插入都会进行必要的维护,如果我们是顺序插入(主键自增),那么直接在最后边追加数据就可以了,但如果我们不按顺序插入,并且此时一个数据页满了,那么就需要申请一个新的数据页,并且会挪动部分数据过去,这个过程叫页分裂,页分裂会降低空间利用率和查询效率。有页分裂就有页合并,当两个相邻的数据页中的空间利用率降低到一定阈值时,此时就会发生页合并,页合并就是逆向的页分裂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值