了解Mysql底层之前,首先要对以下几种数据结构有着比较深入的了解:
- 二叉查找树
- 平衡二叉树
- 红黑树
- 哈希表
- B - 树
为什么要了解这几种数据结构?从这些数据结构出发可以对Mysql的底层有着更加深入的理解。首先来看以下二叉查找树,在查找的过程中,二叉查找树可以将查找效率优化到O(logN),了解二叉查找树一定明白,二叉查找树的一个重要的性质就是比当前节点小的节点都位于当前节点的左子树,比当前节点大的节点都位于当前节点的右子树。但是二叉查找树有着一个相对致命的缺点影响二叉查找树的效率,当插入线性递增或者递减的数据的时候,二叉查找树会退化为为链表,导致查找效率从O(logN)退化为O(N)。为了消除二叉查找树的这种劣势,平衡二叉搜索树被提出,相对于二叉查找树,平衡二叉搜索树每次插入新节点之后调整左右子树的高度差使得树始终保持一个相对平衡的高度。“金五足金,人无完人” 平衡二叉搜索树也并非完美的存在,在每次插入新节点的过程中,都需要消耗系统资源用于调整树的高度使其平衡,对于平衡二叉搜索树,红黑树的提出,弥补了这种缺陷,红黑树是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,红黑树并不追求 “完全平衡”,它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。
那么到底什么事索引呢 ? 索引的本质就是排好序的数据结构。如何理解索引的本质 ?
上面提及的所有数据结构中,红黑树的提出已经很大程度满足查找需要的效率,但是面对海量数据的时候,采用这种数据结构依然无法满足系统的需求。Mysql中索引底层存储的数据结构默认采用的是B + 树的数据结构,这种数据结构的优势可以通过控制树的高度提高存储查询效率。与B - 树相比,Mysql对B -树做了一些变种 :
- 非叶子节点只存储索引
- 叶子节点包含所有索引字段
- 叶子节点通过指针链接,提高区间访问效率【 双向指针 】