B-树
B-树是一种平衡的多路查找树,一棵m阶的B-树,或为空树,或为满足以下特性的m叉树;
树中每个结点至多有m棵子树
若根结点不是叶子结点,则至少有2棵子树
除根之外的所有非终端结点至少有【m/2】棵子树
所有的非终端结点中包含以下信息数据
所有的叶子结点都出现在同一层次,并且不带信息
非叶子结点的关键字个数=指向儿子的指针个数-1;
其中,M为设定的非叶子结点最多子树个数,N为关键字总数;
所以B-树的性能总是等价于二分查找(与M值无关),也就没有B树平衡的问题;
由于M/2的限制,在插入结点时,如果结点已满,需要将结点分裂为两个各占
M/2的结点;删除结点时,需将两个不足M/2的兄弟结点合并;
https://zhuanlan.zhihu.com/p/27700617
B+树(balance+ tree)
B-的变种树。差异在于:
有n棵子树的结点中包含有n个关键字
所有的叶子结点中包含了全部的关键字的信息,及指向这些关键字记录的指针,且叶子结点本身依关键字的大小自小到大顺序链接
所有的非终端结点可以看成是索引部分,结点中仅含有其子树(根结点)中的最大(或最小)关键字。
通常在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为主键也是聚集索引
如果在排序中使用了goods_name就性能就不会太好,在explain解释执行计划时extra出现了filesort。
explain select * from t_goods order by goods_name
Using filesort 是Mysql里一种速度比较慢的外部排序,尽量避免!而如果使用主键id作为排序,就会好很多,因为聚集索引自己就排序好了
explain select * from t_goods order by id
当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, 文档中的位置)}