04 B+树索引

1. 索引是什么?优点和缺点

  索引是存储引擎用于提高数据查询效率的一种数据结构。Mysql中的索引是在存储引擎层实现的,在MySQL中使用较多的索引有 Hash 索引和 B+树索引。InnoDB 采用了 B+ 树索引。先通过 B+ 树找到数据所在的页,然后将页读到内存,在内存中找到要查找的数据。(Mysql 将索引存放在磁盘而不是内存中,减少了内存消耗)
索引优点: ①减少了服务器需要扫描的数据量;②帮助服务器避免排序;③将随机IO变为顺序IO,索引可以加快数据库访问的效率。
索引的缺点:创建索引和维护索引会耗费时间;索引会占用物理空间;当对表进行增删改时,索引也需要动态维护,这样会降低数据的维护速度。一般在频繁使用或需要排序的字段上建立索引,而对于很少查询或重复值较多的列,不适合建立索引。
不宜建立索引的场景:对于非常小的表,不宜建立索引,一般采用简单的全表扫描即可。对于特大型的表,建立和使用索引的代价会随之增大。对于查询中很少涉及的列或者重复值较多的列,也不宜建立索引。
适合建立索引的场景:对于中到大型的表,索引会非常有效。一般可以在频繁使用或需要排序的字段上建立索引。

2. hash索引么跟B+树索引的区别,哪个性能好

范围区别:

  1. hash索引因为底层是哈希表,速度很快除非有很多哈希冲突。数据存储在哈希表中是无序的,如果要范围查找就需要全表扫描,所以他不适合范围查找。哈希索引数据不是按照索引值顺序存储的,无法用于排序。不支持部分索引列匹配查找(因为哈希索引是按照全列名计算hash值的),只适合等值扫描。
  2. B+ tree树索引,底层是多路查询平衡树,节点是天然有序的(左节点小于服节点,右节点大于父节点),所以对于范围查找的时候不需要做全表扫描;适合等值查找,范围查找,最左前缀查找。
3. MySQL数据库的索引,底层实现为什么用B+树?
  • 每次读取节点,就会进行一次磁盘的 IO 操作,所以树越高,IO次数也就越多。为了尽量减少耗时的IO次数,需要降低树的高度,采取的办法就是将索引构建成 m 叉树。由于操作系统是按磁盘页来读取的,而B+树的中间节点不存放数据,使得单一节点可以存储更多的元素,所以同样大小的磁盘页可以容纳更多的节点元素,这就意味着数据量相同的情况下,B+树会更矮胖一点,所以IO次数也更少。
  • B+树的查询必须查到叶子节点,而B树只要找到匹配元素即可,所以B树没有B+树的查询性能稳定。
  • B树只能依靠繁琐的中序遍历来做范围查询,而B+树所有叶子节点形成有序链表,很方便范围查询。
4. 什么是B+树?
  • 每个中间节点都包含 k 个元素和 k 个子节点,其中 m/2 <= k <= m ,如果除不尽就向上取整。
  • 中间节点中的元素不存储数据,只存储索引,所有数据都保存在叶子节点中,叶子节点都位于同一层,而且叶子节点本身按照关键字的大小通过链表串联在一起。B 树中的叶子节点并不需要链表来串联。
  • 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)的元素。
  • B+树的查找与B树不同,当索引部分某个结点的关键字与所查的关键字相等时,并不停止查找,应继续沿着这个关键字左边的指针向下,一直查到该关键字所在的叶子结点为止。

在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

5. 什么是B(B-)树?
  • 根节点至少有两个子节点。
  • 每个中间节点都包含 k - 1 个元素和 k 个孩子节点,元素中保存数据。其中 m/2 <= k <= m ,如果除不尽就向上取整。
  • 所有叶子节点都位于同一层。
  • 每个节点中的元素从小到大排列,节点中 k - 1 个元素正好是 k 个孩子所包含元素的值域分划。

B(B-)树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

6. B+树和B树的区别?为什么用B+树,而不用B树

  Mysql用磁盘IO次数衡量查询效率,一般来说索引非常大,为了减少内存的占用,索引也会被存储在磁盘上。B类树的特点就是每层节点数目非常多,层数很少,目的就是为了减少磁盘IO次数。

  1. B+树只有叶节点存放数据,其它节点并不存储数据,节点小,磁盘IO次数就少。而B树是每个索引节点都会有Data域,这增大了节点大小,增加了磁盘IO次数。(磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多)B+树的层高会小于B树,B树平均的IO次数会远大于 B+树
  2. B+树叶子节点是用双向链表连接起来的,遍历叶子节点就能进行范围查询。 B树范围查询只能中序遍历。
  3. B树索引节点没有数据,比较小。B树索引可以完全加载至内存中,占用内存少。
7. 为什么用B+树,而不红黑树?

  AVL 树(平衡二叉树)和红黑树(二叉查找树)基本都是存储在内存中才会使用的数据结构。因为红黑树往树的深度过大会造成磁盘IO读写过于频繁,进而导致效率低下。所以要使用高度较小的树的结构。B类树可以有多个子树,可以降低树的高度。

8. B+树一个节点有多大?
  • B+树一个节点的大小设为一页或页的倍数最为合适。因为如果一个节点的大小 < 1页,那么读取这个节点的时候其实读取的还是一页,这样就造成了资源的浪费。
  • 在 MySQL 中 B+ 树的一个节点大小为“1页”,也就是16k。之所以设置为一页,是因为对于大部分业务,一页就足够了:
    • 首先InnoDB的B+树中,非叶子节点存的是key + 指针;叶子节点存的是数据行。
    • 对于叶子节点,如果一行数据大小为1k,那么一页就能存16条数据;对于非叶子节点,如果key使用的是bigint,则为8字节,指针在mysql中为6字节,一共是14字节,则16k能存放 16 * 1024 / 14 = 1170 个索引指针。于是可以算出,对于一颗高度为2的B+树,根节点存储索引指针节点,那么它有1170个叶子节点存储数据,每个叶子节点可以存储16条数据,一共 1170 x 16 = 18720 条数据。而对于高度为3的B+树,就可以存放 1170 x 1170 x 16 = 21902400 条数据(两千多万条数据),也就是对于两千多万条的数据,我们只需要高度为3的B+树就可以完成,通过主键查询只需要3次IO操作就能查到对应数据。所以在 InnoDB 中B+树高度一般为3层时,就能满足千万级的数据存储,所以一个节点为1页,也就是16k是比较合理的。
9. 索引是怎么提高效率的?

数据索引的存储是有序的,所以通过索引查询一个数据效率很高。
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值