索引 原理与B+ 树

  • 数据库的高效查询离不开索引,那么索引是什么?索引的原理是啥?为何查询更快?
  • 索引在mysql的定义是:索引是一个提高查询效率的数据结构。一个有序的数据集合,正因为有序所以利用高效的查询算法就可以提高查询的效率。
  • 常见的查询算法:顺序查询,二分法查询,二叉树查询,块查询。
  • 顺序查询:效率最低,因此也适合无序的数据集合查询。
  • 二分法查询:即利用数据集的有序性,一次淘汰一半数据,从而提高查询的效率。
  • 二叉树查询:常用的是平衡二叉树,即每个节点都只有两个子节点,且左边的节点都小于根节点,右边的节点都大于根节点。反之也可以。
  • 块查询:即将数据集合分成一块块的,块与块之间有序,快内无序有序都可以。这样可以查找的效率。
  • 可以看出,要想提高查询的效率关键还是构建一个有序的数据集,然后根据不同的算法生成对应的有序集合。
  • 平衡多路二叉树:即B-tree,通过扩展节点的宽度,从而构建一个宽度和深度适合的集合,从而提高查询效率。
  • B-tree的特点:一个m阶的B-tree 树,下图是3阶。即d=2 ,h=3
  • 根节点非叶子节点,则至少有2个子节点。
  • 除去根节点和叶子节点,其他节点至少有ceil(m/2)个子节点,这里就是至少2个子节点。
  • 所有叶子节点的深度一致。
  • d 大于等于1正整数,称为B-tree 的度,h 是B-tree的高度。
  • 每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d。
  • 每个叶子节点最少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶节点的指针均为null 。
  • B+tree  B+ 树相对于B树的有点在于,B+ 采用内节点只存储key,所有数据存在于叶子节点。
  • 叶子节点之间使用指针链接起来,构成一个有序的链表形式。
  • 叶子节点深度一致。
  •  
  • 在mysql的InnoDB存储引擎里:
  • 主键建立主索引,主索引的最后的叶子节点存储的就是数据库表的记录,即key的value就是表的一条记录。
  • 辅助索引的叶子节点指向的是主键ID。
  • 这两点是与MyISAM 存储引擎不同之处。
  • MyISAM 里叶子节点记录的是表中每行数据的起始地址。
  • 辅助索引和主索引一样记录的都是地址。
  • 索引的最左匹配规则:在abc三个列上建立一个联合索引,那么这个索引是怎样的呢?

| A | B | C |

| 1 | 2 | 3 |

| 1 | 4 | 2 |

| 1 | 1 | 4 |

| 2 | 3 | 5 |

| 2 | 4 | 4 |

| 2 | 4 | 6 |

  • 联合索引就像是按照字典查找字一样,先查第一个字母,在查第二个字母,最后查第三个。
  • 由此可见,索引存遵循最左前缀匹配规则。

注:ceil 向上取整。部分图片摘自网络。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值