个人能力有限,如有错误请指出,共同学习。
创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:做网站、成都网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的盘锦网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
二叉树
B树
B+树
特点:
聚簇索引
二级索引
key数据存储量估算:
若每个页可以存1000个key,而且树的高度是4,那么
前提条件如下:
插入步骤
步骤一
因为索引中还没有数据,所以此时的B+树只有一个空的根结点,又由于一个页只能存3个key,首先将10,20,5插入进去(实际上此步发生了3次插入),然后在页面内做数据排序,最终结果如下图:
步骤二:
由于根页面已经写满,此时插入8,将发生分裂(根页面分裂),大致步骤如下:
注意:在分裂过程中,根结点始终是不会变的,不管变成多大的树,根结点的页面号始终如一。
步骤五:
插入数据40,发现比根结点23大,找到103号页面,发现已满,执行分裂,分裂同上面叶子结点的分裂步骤。分裂后如图所示:
步骤六:
继续插入下一个数据9,因为比20小,找到101号页面,发现已满,需要做叶子结点分裂,如下图:
传统B+树的数据删除,一般都会有一个所谓的填充因子,来控制页面数据的删除比例,如果数据量小于这个填充因子所表示的数据量,就会有节点合并,这与分裂是相对应的。
InnoDB的实现与传统B+树算法有不同之处,InnoDB在删除索引数据时,会先检查当前页剩余的记录数,如果只剩下一条记录,就会直接将这个页面从B+树中摘除,也只有这种情况,InnoDB才会回收一个页面,InnoDB的页面没有合并一说,但是对于根节点,即使索引数据全部删除,根节点页依然存在,只不过是以空页的形式存在。
下面举个例子描述索引删除过程,前提条件与前面插入记录时一致。
删除数据 50
删除过程全部结束,最终得到一个空的索引页。
《MySQL运维内参》
B+树动画演示:
聚集索引可以用b树实现。
简介:
B+树中只有叶子节点会带有指向记录的指针,而B树则所有节点都带有。
B+树索引可以分为聚集索引和非聚集索引。
mysql使用B+树,其中Myisam是非聚集索引,innoDB是聚集索引。
聚簇索引索引的叶节点就是数据节点;而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。
B+ 树的特点:
(1)所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的。
(2)不可能在非叶子结点命中。
(3)非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层。
MySQL的Innodb存储引擎的索引分为聚集索引和非聚集索引两大类
特点:B+树叶子节点存储行数据
一个表中,必须有一个聚集索引,只能有一个聚集索引,Innodb通常把一个表的主键索引作为聚集索引,如果没有主键InnoDB会选择一个唯一索引代替。如果没有这样的索引,InnoDB会隐式的定义一个主键来作为聚集索引,这个字段为6个字节,类型为长整形。
利用主键索引查找行数据是最快的,建议使用自增主键原因是利于索引树的构建(主键自增写入时新插入的数据不会影响到原有页,插入效率高;但是如果主键是无序的或者随机的,那每次的插入可能会导致原有页频繁的分裂,影响插入效率)
特点:B+树叶子节点存储主键ID
一个表中可以有多个非聚集索引,每个非聚集索引即是一棵B+树
通过非聚集索引查找数据时,需要先在非聚集索引上找到主键ID,再从聚集索引获取行数据,这个过程就称之为回表
B树索引中的B树实际上是B+树,至于为什么使用B+树而不使用B树或者红黑树的原因在另外的文章中有提及。
特点:
特点:类似JDK中的HashMap,但无法支持范围查询
特点:使用的算法仍然是B树索引,不同的就是索引列的值必须唯一
对于普通索引来说,查找到满足条件的第一个记录后,需要查找下一个记录,直到碰到第一个不满足条件的记录。
对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索,提升索引性能
另外插入行时会构建该唯一索引,假如索引值重复将插入失败,适合业务上做唯一性检验
通过建立倒排索引,可以极大的提升检索效率,解决判断字段是否包含的问题,但是业务上一般都不采用这种索引,而是使用ES处理全文搜索需求
仅对某个特定字段建立的索引,如(biz_id)
对多个字段建立的索引,如(biz_id,type)