在计算机科学中,B树(英语:B-tree)是一种自平衡的树,可以保持数据有序。这种数据结构可以让查找数据、顺序访问、插入数据及删除的动做,都在对数时间内完成。B树,归纳来讲是一个通常化的二叉查找树(binary search tree),能够拥有多于2个子节点。与自平衡二叉查找树不一样,B树为系统大块数据的读写操做作了优化。B树减小定位记录时所经历的中间过程,从而加快存取速度。B树这种数据结构能够用来描述外部存储。这种数据结构常被应用在数据库和文件系统的实现上。html
B-Tree is a self-balanced search tree with multiple keys in every node and more than two children for every node.
B树是一种自平衡的搜索树,每个节点node都有多个keys,而且每一个节点有2个子节点或者多于2个子节点。node
A B+ tree is an N-ary tree with a variable but often large number of children per node. A B+ tree consists of a root, internal nodes and leaves.The root may be either a leaf or a node with two or more children
B+树是一个n叉排序树,一般每一个节点有多个孩子,一棵B+树包含一个根节点、多个内部节点和叶子节点。根节点多是一个叶子节点,也多是一个包含两个或两个以上孩子节点的节点。mysql
B-Tree of Order m has the following properties...sql
Property #1
- All the leaf nodes must be at same level.Property #2
- All nodes except root must have at least [m/2]-1 keys and maximum of m-1 keys.Property #3
- All non leaf nodes except root (i.e. all internal nodes) must have at least m/2 children.Property #4
- If the root node is a non leaf node, then it must have at least 2 children.Property #5
- A non leaf node with n-1 keys must have n number of children.Property #6
- All the key values within a node must be in Ascending Order.In a B-Ttree, the search operation is similar to that of Binary Search Tree. In a Binary search tree, the search process starts from the root node and every time we make a 2-way decision (we go to either left subtree or right subtree). In B-Tree also search process starts from the root node but every time we make n-way decision where n is the total number of children that node has. In a B-Ttree, the search operation is performed with O(log n) time complexity. The search operation is performed as follows...数据库
大体的意思就是查询的条件A,和root节点值比较,若是相等则success,不相等则判断是否小于该节点,小于则查询左子树,大于则查询此时节点的下一个值,以此类推,直到此时节点最后一个值仍是小于A,则查询右子树,直到找到或者结束查找。数据结构
Insertion Operation in B-Tree
In a B-Tree, the new element must be added only at leaf node. That means, always the new keyValue is attached to leaf node only. The insertion operation is performed as follows...ide
参考8的连接,有图有真相,这里就摘录一些重点文字条件吧。优化
k:删除的值 x: k所在的节点 x.n: k所在节点的长度 t: k所在节点的层级
Here you can straightaway delete k from x.spa
If k is in the node x which is a leaf and x.n == (t-1).net
Find the immediate sibling y of x, the extreme key m of y, the parent p of x and the parent key l of k If y.n >= t: Move l into x Move m into p Delete k from x
Find the immediate sibling y of x, the extreme key m of y, the parent p of x and the parent key l of k If y.n == t-1: Merge x and y Move down l to the new node as the median key Delete k from the new node
If k is in the node x and x is an internal node (not a leaf)
Find the child node y that precedes k (the node which is on the left side of k) If y.n >= t: Find the key k’ in y which is the predecessor of k Delete k’ recursively. (Here k’ can be another internal node as well. So we have to delete it recursively in the same way) Replace k with k’ in x
Find the child node y that precedes k If y.n < t (or y.n == (t-1)): Find the child node z that follows k (the node which is on the right side of k) If z.n >= t: Find k’’ in z which is the successor of k Delete k’’ recursively Replace k with k’’ in x
Find the child node y that precedes k and the child node z that follows k If y.n == (t-1) AND z.n == (t-1): Merge k and z to y Free memory of node z Recursively delete k from y
B和B+树的区别在于,B+树的非叶子结点只包含key信息,不包含data,每一个节点的指针上限为2t而不是2t+1.全部的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。
磁盘存储和mysql的索引这一块用的比较多,以空间换时间来提高查找速度。(图片基本是从参考连接那边拿过来的,站在前人的肩膀上。)