索引是在数据库非常常用的。
在mysql数据库中主要有Hash和b- tree两种索引。其中以b -tree索引为例子来说明 提到b-tree的结构可以用二叉树来辅助说明
二叉搜索树:binary search tree
B树的搜索过程:
从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;
否则,如果查询关键字比结点关键字小,就进入左儿子;
如果比结点关键字大,就进入右儿子;
如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;
如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(既平衡),那么B树的搜索性能逼近于二分查找;但是它比连续内存空间的二分查找的优点是:改变B树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;
**
B-树 平衡多路查找树
**
B-tree,它是一种多路搜索树(并不是上文所述的二叉的):
简单描述查询过程:
模拟查找关键字29的过程:
- 根据根节点找到磁盘块1,读入内存。【磁盘I/O操作第1次】 比较关键字29在区间(17,35),找到磁盘块1的指针P2。
根据P2指针找到磁盘块3,读入内存。【磁盘I/O操作第2次】 比较关键字29在区间(26,30),找到磁盘块3的指针P2。
根据P2指针找到磁盘块8,读入内存。【磁盘I/O操作第3次】 在磁盘块8中的关键字列表中找到关键字29。
分析上面过程,发现需要3次磁盘I/O操作,和3次内存查找操作。
由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率。而3次磁盘I/O操作是影响整个B-Tree查找效率的决定因素。
B-Tree相对于AVLTree缩减了节点个数,使每次磁盘I/O取到内存的数据都发挥了作用,从而提高了查询效率。