1)n叉平衡树(B/+tree)结构
定义:二叉平衡树中每个结点有一个数据项,最多有两个子节点,如果允许树的每个节点可以有两个以上的子节点,那么这个树就称为n阶的多叉树,或称为n叉树。
性质:每个节点有m个子节点和m-1个键值。
每个节点中的键值按升序排列。
前i个子节点中的键值都小于第i个键值
后m-i
个子节点中的键值都大于第i个键值。
2)B树(n叉平衡树)
B树中每个节点包含了键值和键值对于的数据对象存放地址指针。所以成功搜索一个对象可以不用到达树的叶节点。成功搜索包括节点内搜索和沿某一路径的搜索,成功搜索时间取决于关键码所在的层次以及节点内关键码的数量。
在B树种查找给定的关键字的方法是:首先把根节点取来,在根节点所包含的关键字k1,....kj查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功;否则,一定可以确定要查的关键字在某个ki或ki+1之间,于是取Pi所指的下一层索引节点块继续查找,直到找到,或指针pi为空时查找失败。
3)B+ 树(n 叉平衡树)
B+树非叶节点中存放的关键码并不指示数据对象的地址指针,非叶节点只是索引部分。所有的叶节点在同一层上,包含了全部关键码和相应数据对象的存放地址指针,且叶节点按关键码从小到大顺序链接。如果实际数据按加入的数据存储而不是按关键码次数存储的话,叶节点的索引必须是稠密索引,若实际数据请按关键码次序存放的话,叶节点索引是稀疏索引。
B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。
所以B+树有两种搜索方法:一种是按叶节点自己拉起的链表顺序搜索。一种是从根节点开始搜索,和B树类似,不过如果非叶节点的关键码等于给定值,搜索并不停止,二是继续沿右指针,一直查到叶节点上的关键码,所以无论搜索是否成功,都将走完树的所有层。
B+ 树中,数据对象的插入和删除仅在叶节点上进行。
4) B树与B+树数据结构的不同之处:
a. B树中同一键值不会出现多次,并且它有可能出现在叶节点,也有可能出现在非叶节点中。而B+树的键一定会出现在叶节点中,并且有可能在非叶节点中也有可能重复出现,以维持B+树的平衡。
b. 因为B树键位置不定,且在整个树结构中只出现一次,虽然可以节省存储空间,但使得插入、删除操作复杂度明显增加。B+树相比来说是一种较好的折中。
c. B树的查询效率与键在树中的位置有关,最大时间复杂度与B+树相同(在叶节点的时候),最小时间复杂度为1(在根节点的时候)。而B+树的时间复杂度对某简称的树是固定的。
5) 页的概念:页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页的大小通常为4k, Innodb页占16k),主存和磁盘以页尾单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会想磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续执行。
6) 概念
1、B-/+ tree 将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入,为了达到这个目的,在实际实现B-tree还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。
2、B-/+ tree 对索引列是顺序组织存储的,所以很适合查找范围数据。索引对多个值进行排序的依据是create table 语句中定义索引时列的顺序。
3、MyISAM存储引擎使用B-Tree索引,InnoDB存储引擎使用B+Tree索引。MyISAM 使用前缀压缩技术使得索引更小,但InnoDB则按照原始数据格式进行存储。MyISAM索引通过数据的物理位置引用被索引的行,而InnoDB则根据主键引用被索引。
4、B TREE/B+ TREE索引的查询类型
适用于全键值、键值范围或键前缀查找,如下有效:
全值匹配: 指的是和索引中的所有列进行匹配
匹配最左前缀:只使用索引的第一列
匹配列前缀:只匹配某一列的值的开头部分
匹配范围值:索引可用于查找列的范围值。(可用like a%,但不能使用like %b)
精确匹配某一列并范围匹配另外一列:第一列全匹配,第二列范围匹配
只访问索引的查询:B- TREE 通常可以支持“只访问索引的查询”,即查询只需要访问索引,而无须访问数据行,即覆盖索引。
*因为索引树中的节点是有序的,所以除了按值查找之外,索引还可以用于查询中的order by 操作(按顺序查找)。一般来说,如果B-tree可以按照某种方式查找到值,那么也可以按照这种方式用于排序。
5、 关于B -/+ Tree 索引的限制:
1)如果不是按照索引的最左列开始查找,则无法使用索引。
2)不能跳过索引中的列。
3)如果查询中某个列是范围查询,则其右边所有列都无法使用索引优化查询。
4)如果查询中的列不是独立的,则mysql不会使用索引。“独立的列”是指索引列不能是表达式的一部分,也不能是函数的参数。
5)如果查询是范围值,且使用的是like %b,则不会使用索引。
6、单列索引和多列索引
单列索引:就是平常的索引只有一个字段的方式
多列索引(组合索引):在多个列上创建索引。一个索引可以由最多15个列组成。组合索引的原则:最左前缀列,按照索引的排列顺序.