Mysql索引实现

1.索引到底是什么?

索引是帮助MySQL高效获取数据的排好序的数据结构,索引存储在磁盘文件里
索引结构: 二叉树,红黑树,HASH,BTREE
磁盘存取原理: 寻道时间(速度慢,费时),旋转时间(速度较快),一般使用磁盘I/O次数评价索引结构的优劣

2.为什么不使用红黑树来实现索引?

一般使用磁盘I/O次数评价索引结构的优劣。先从B-Tree分析,根据B-Tree的定义,可知检索一次最多需要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:
每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。
B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3)。
综上所述,用B-Tree作为索引结构效率是非常高的。
而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。

3. 为什么mysql的索引使用B+树而不是B树呢?

  1. B+树更适合外部存储(一般指磁盘存储),由于内节点(非叶子节点)不存储data,所以一个节点可以存储更多的内节点,每个节点能索引的范围更大更精确。也就是说使用B+树单次磁盘IO的信息量相比较B树更大,IO效率更高。
  2. mysql是关系型数据库,经常会按照区间来访问某个索引列,B+树的叶子节点间按顺序建立了链指针,加强了区间访问性,所以B+树对索引列上的区间范围查询很友好。而B树每个节点的key和data在一起,无法进行区间查找。
    BTree结构图特点:
    度(Degree)-节点的数据存储个数
    叶节点具有相同的深度
    节点中的数据key从左到右递增排列
    在这里插入图片描述
    B+Tree结构图特点:
    非叶子节点不存储data,只存储key(主键),可以增大度
    顺序访问指针,提高区间访问的性能
    在这里插入图片描
    Tips:
    1.mysql InnoDB的表必须有主键,主键建议用自增主键.如果使用uuid作为主键,插入数据时位置是不确定的,如果插入的位置那一页满了,会造成页重组
    2.mysql InnoDB的表非主键索引页子节点存储主键值(查询过程会有一个回表的过程),这样做的目的提高一致性和节省储存空间
    数据结构动态图:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值