innodb的索引的概述

innnodb的索引分为两种
  • B+树索引
    B+树索引的构造类似于二叉树,根据key value快速找到数据,但是B+树索引中的B并不是代表的binary,而是代表balance,B+树是从平衡树改进过来的,B+树不是二叉树。B+树索引并不能根据key找到对应的行,而是找到对应的页,再进行寻找
  • 哈希索引
B+树

B+树是平衡树改进过来的,平衡树不再赘述。B+树是为了存储设备而设计的一种平衡二叉树,在B+树中,所有记录的节点都是按照键值的大小顺序放在同一层中,各个节点通过指针进行相连,例如下一个B+树:高度为2,扇出为5,每页最多放置4条记录

简单的B+树

B+树中的键值都在节点中,如果要获取到顺序的键值,只需要从左至右遍历即可。

B+的插入操作

B+树的插入要保证在插入后节点依然是有序的,同时要考虑三种情况,如图缩图所示

B+树插入的三种情况

  • 第一种情况
    例如插入28,这种情况下leaf page 未满,index page也未满,直接插入既可

    这里写图片描述

  • 第二种情况
    当leaf page 满的时候,index page未满的时候,我们将需要做的操作为:拆分leaf ,将中间的节点放置在index中,然后小于中间节点的放置在左边,大于等于中间节点的放置在右边,例如插入70

简单的B+树

  • 第三种情况
    leaf page 跟 index page 都满了的时候需要做的事情为:1找到对应的leaf page 拆分,再将index 拆分成两个,然后再增加一个层级,此时已经为3层,如图所示

这里写图片描述

为了保持平衡,插入操作会进行大量的拆分页,而B+树是用于磁盘。页的拆分将会增加大量的磁盘的操作。所以应该尽量减少页的拆分,而B+树提供了旋转(rotation)的功能。

旋转发生在leaf page满了的情况下,但是左右节点并没有满的时候。这时候B+树并不会急于去拆分页,而是先将记录转移到所在页的兄弟节点上。通常情况下,左兄弟被首先检查用来左旋转操作,对于第二种情况插入70:

简单的B+树

这里写图片描述

由此可见旋转操作减少了一次分页的操作。

B+树的删除操作

B+树使用填充因子来控制树的变化,50%是填充因子的可设最小值,B+树的删除操作同样需要考虑到三种情况

这里写图片描述

  • 第一种情况
    删除70

    这里写图片描述

这里写图片描述

  • 第三种情况
    需要同时合并leaf page 跟 index page,在上图中删除60后,如图所示

这里写图片描述

B+树索引

前面讲的是一般的B+树的一般操作,B+树索引也是按照B+树在数据库中的实现,但是B+树索引在数据库中的有一个特点就是高扇出性,在数据库中B+树的高度一般只有2-3层,这样就只要进行2-3次IO,一般的磁盘每秒至少都能做到上百次IO,2-3次的IO代表查询时间只有0.02-0.03秒。
B+树索引又可以分为聚集索引(clustered index)跟辅助聚集索引(secondary index),但是这两种索引都是B+树实现的,都是高度对称的,其差别主要是叶子节点存放的是否是一整行的信息。

聚集索引

innodb是索引组织表,即表中数据按照索引顺序存放,而聚集索引就是将表的主键构建一个索引树,将行数据放在叶子节点中,聚集索引中包含了索引组织表中的数据。每个数据页通过一个双向链表来进行链接。
由于数据页只能按照一棵B+树进行排序,所以每张表只能有一个聚集索引,查询优化器也特别喜欢聚集索引,因为聚集索引上就能直接找到数据,此外,由于定义了数据的逻辑顺序,所以聚集索引能很快找到针对范围值的查询,查询优化器通过扫描去寻找某一范围的数据页去寻找具体数据

辅助聚集索引

辅助聚集索引也叫非聚集索引,叶级别不包含所有的行的数据,叶节点除了包含键值以外,每个叶级别中的索引都包含了一个书签,该书签告诉innodb存储引擎,该到什么地方去寻找该索引对应的数据。因为innodb存储引擎表是索引组织表,所以辅助聚集索引的叶节点的书签就是相应行数据的聚集索引键,

这里写图片描述

一张表可以拥有多个辅助聚集索引和一个聚集索引。

mysql 的innodb修改聚集索引的时候需要将重新建立一张临时表,然后数据迁移过去,然后删除旧表,将临时表改名,而非聚集索引就不需要新建临时表。所以更改主键索引,如果表中的数据很大的时候会很慢。

  • 建立索引的注意点:
    字段的值是高选择性,即这个表中该字段的值重复性很低,比如 姓名就适合建立索引,但是性别就不适合建立索引,使用索引的时候也要注意尽量选取值的时候不能超过数据的一定比例,这样即使语句上使用了索引(非聚集索引),但是也会被优化器进行全表扫描。
    why? 在机械硬盘中,顺序读的速度比随机读快很多,而非聚集索引使用的时候并不能一次性获得全部数据,还需要去聚集索引获得,当满足非聚集索引的条件的数据很多的时候,优化器认为使用非聚集索引的随机读还不如ALL顺序读,这样就被使用了全表扫描。(固态硬盘情况情况不一样了)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值