b-树(m阶):mysql
1.根节点至少有2个子节点;sql
2.中间节点包含k个子节点和k-1个元素,m/2 <= k <= m;数据结构
3.每一个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划;性能
4.每个叶子节点都包含k-1个元素,其中 m/2 <= k <= m;mysql索引
5.全部叶子节点都在同一层。指针
b+树(m阶):索引
在b-树的基础上添加了新的特性:io
1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每一个元素不保存数据,只存储索引,全部数据都保存在叶子节点。基础
2.全部的叶子结点中包含了所有元素的信息,及指向含这些元素记录的指针,且叶子结点自己依关键字的大小自小而大顺序连接。搜索
3.全部的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
b+树相比b-树优势:
1.io次数少:b+树中间节点只存索引,不存在实际的数据,因此能够存储更多的数据。索引树更加的矮胖,io次数更少。
2.性能稳定:b+树数据只存在于叶子节点,查询性能稳定
3.范围查询简单:b+树不须要中序遍历,遍历链表便可
mysql索引:
索引字段要尽可能小:经过上面的分析,咱们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每一个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N必定的状况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,若是数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为何每一个数据项,即索引字段要尽可能的小,好比int占4字节,要比bigint8字节少一半。这也是为何b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度降低,致使树增高。当数据项等于1时将会退化成线性表。
最左匹配特性:当b+树的数据项是复合的数据结构,好比(name,age,sex)的时候,b+数是按照从左到右的顺序来创建搜索树的,好比当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来肯定下一步的所搜方向,若是name相同再依次比较age和sex,最后获得检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪一个节点,由于创建搜索树的时候name就是第一个比较因子,必需要先根据name来搜索才能知道下一步去哪里查询。好比当(张三,F)这样的数据来检索时,b+树能够用name来指定搜索方向,但下一个字段age的缺失,因此只能把名字等于张三的数据都找到,而后再匹配性别是F的数据了, 这个是很是重要的性质,即索引的最左匹配特性。
过分使用索引的缺点:
1.在建立索引和维护索引 会耗费时间,随着数据量的增长而增长2.索引文件会占用物理空间,除了数据表须要占用物理空间以外,每个索引还会占用必定的物理空间3.当对表的数据进行 INSERT,UPDATE,DELETE 的时候,索引也要动态的维护,这样就会下降数据的维护速度,(创建索引会占用磁盘空间的索引文件。通常状况这个问题不太严重,但若是你在一个大表上建立了多种组合索引,索引文件的会膨胀很快)