mysql数据结构_从B树,B+树到MySQL索引数据结构

B-树

B-树是一种平衡的多路查找树,一棵m阶的B-树,或为空树,或为满足以下特性的m叉树;

  1. 树中每个结点至多有m棵子树

  2. 若根结点不是叶子结点,则至少有2棵子树

  3. 除根之外的所有非终端结点至少有【m/2】棵子树

  4. 所有的非终端结点中包含以下信息数据

  5. 所有的叶子结点都出现在同一层次,并且不带信息

  6. 非叶子结点的关键字个数=指向儿子的指针个数-1;

其中,M为设定的非叶子结点最多子树个数,N为关键字总数;

所以B-树的性能总是等价于二分查找(与M值无关),也就没有B树平衡的问题;

由于M/2的限制,在插入结点时,如果结点已满,需要将结点分裂为两个各占

M/2的结点;删除结点时,需将两个不足M/2的兄弟结点合并;

094a032f0ce77dde54825bea2e0b94e5.png

https://zhuanlan.zhihu.com/p/27700617

B+树(balance+ tree)

B-的变种树。差异在于:

  1. 有n棵子树的结点中包含有n个关键字

  2. 所有的叶子结点中包含了全部的关键字的信息,及指向这些关键字记录的指针,且叶子结点本身依关键字的大小自小到大顺序链接

  3. 所有的非终端结点可以看成是索引部分,结点中仅含有其子树(根结点)中的最大(或最小)关键字。

通常在B+树中有2个头指针,一个指向根结点,另一个指向关键字最小的叶子结点。因此,可以对B+树进行两种查找运算:一种是从最小关键字起顺序查找,另一种是从根结点开始,进行随机查找。

B+ 树索引是目前关系型数据库系统中查找最为常用和有效的索引,其构造类似于二叉树,根据键值对快速找到数据。B+树(balance+ tree)由B树(banlance tree 平衡二叉树)和索引顺序访问方法(ISAM: Index Sequence Access Method)演化而来,这几个都是经典的数据结构。而MyISAM引擎最初也是参考ISAM数据结构设计的。

(1)B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加;(2)B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样;(3)B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。(4)非叶子节点的子节点数=关键字数(来源百度百科)(根据各种资料 这里有两种算法的实现方式,另一种为非叶节点的关键字数=子节点数-1(来源维基百科),虽然他们数据排列结构不一样,但其原理还是一样的Mysql 的B+树是用第一种方式实现);

https://tech.meituan.com/2014/06/30/mysql-index.html

InnoDB的B+树索引

InnoDB的B+ 树索引的特点是高扇出性,因此一般树的高度为2~4层,这样我们在查找一条记录时只用I/O 2~4次。当前机械硬盘每秒至少100次I/O/s,因此查询时间只需0.02~0.04s。

聚集索引

数据库中的B+ 树索引分为聚集索引(clustered index)和辅助索引(secondary index)。它们的区别是叶子节点存放的是否为一整行的完整数据。

聚集索引就是按照每张表的主键(唯一)构造一棵B+ 树,同时叶子节点存放整行的完整数据,因此将叶子节点称为数据页。由于定义了数据的逻辑顺序,聚集索引也能快速的进行范围类型的查询。

聚集索引能够针对主键进行快速的排序查找和范围查找,由于是双向链表,因此在逆序查找时也非常快。

用Explain分析SQL语句的时候,经常发现有的语句在Extra列会出现Using filesort,这是一种不好的sql方式。例如,对于表t_goods,id为主键也是聚集索引

36a26514a03df3ab4ed5afd4dedc8938.png如果在排序中使用了goods_name就性能就不会太好,在explain解释执行计划时extra出现了filesort。

explain  select * from t_goods order by goods_name

a91e46543df76ac7a51734a033eff1bb.png

Using filesort 是Mysql里一种速度比较慢的外部排序,尽量避免!而如果使用主键id作为排序,就会好很多,因为聚集索引自己就排序好了

explain  select * from t_goods order by id

4aa872d1f51cdbd0f7fadec6cf10cc00.png

当where条件和order by同时出现时,如果where中字段A使用了索引,而order by的字段是B,查看执行计划时,就会出现filesort文件排序。解决这个问题就是建立一个包含 WHERE 和 ORDER BY 条件的混合索引。

辅助索引

辅助索引又称非聚集索引,其叶子节点不包含行记录的全部数据,而是包含一个书签(bookmark),该书签指向对应行数据的聚集索引,告诉InnoDB存储引擎去哪里查找具体的行数据。辅助索引与聚集索引的关系就是结构相似、独立存在,但辅助索引查找非索引数据需要依赖于聚集索引来查找。

全文索引

我们通过B+ 树索引可以进行前缀查找,如:

select * from blog where content like 'xxx%';

只要为content列添加了B+ 树索引(聚集索引或辅助索引),就可快速查询。但在更多情况下,我们在博客或搜索引擎中需要查询的是某个单词,而不是某个单词开头,如:

select * from blog where content like '%xxx%';

此时如果使用B+ 树索引依然是全表扫描,而全文检索(Full-Text Search)就是将整本书或文章内任意内容检索出来的技术。

倒排索引

全文索引通常使用倒排索引(inverted index)来实现,倒排索引和B+ 树索引都是一种索引结构,它需要将分词(word)存储在一个辅助表(Auxiliary Table)中,为了提高全文检索的并行性能,共有6张辅助表。辅助表中存储了单词和单词在各行记录中位置的映射关系。它分为两种:

  • inverted file index(倒排文件索引),表现为{单词,单词所在文档ID}

  • full inverted index(详细倒排索引),表现为{单词,(单词所在文档ID, 文档中的位置)}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值