mysql 索引的数据结构

 建立的索引的目的是提高查询速度。那么建立索引为什么能提高查询数据呢?是采用什么样的数据结构或则算法呢?


        索引本身数据量也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数,提升索引效率。

常用的索引类型:

  1. 顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕。

  2. 二叉树查找(binary tree search): O(log2n),对于某些情况,二叉查找树会退化成一个有n个节点的线性链,和顺序查找差不多。显然这个二叉树的查询效率就很低。

  3. hash索引: 哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效,无法满足范围查找。

  4. 红黑树:一种平衡二叉树,一个节点只能有左子树和右子树,导致树高度非常高,逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,IO次数多查找慢,效率低。逻辑上相邻节点没法直接通过顺序指针关联,可能需要迭代回到上层节点重复向下遍历找到对应节点,效率低

  5. B Tree:

    • B-TREE 每个节点都是一个二元数组: [key, data],所有节点都可以存储数据。key为索引,data为数据。
    • 检索原理:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或未找到节点返回null指针。
    • 缺点:1.插入删除新的数据记录会破坏B-Tree的性质,因此在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持B-Tree性质。造成IO操作频繁。2.区间查找可能需要返回上层节点重复遍历,IO操作繁琐。
  6. B+Tree: B Tree的变种

    • 与B Tree相比,B+Tree有以下不同点:非叶子节点不存储data,只存储索引key;只有叶子节点才存储data
    • Mysql中B+Tree:在经典B+Tree的基础上进行了优化,增加了顺序访问指针。在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。这样就提高了区间访问性能

2、B+树索引的性能优势:

1)、结合操作系统存储结构优化处理: mysql巧妙运用操作系统存储结构(一个节点分配到一个存储页中->尽量减少IO次数) & 磁盘预读(缓存预读->加速预读马上要用到的数据)。

2)、B+树单个节点能放多个子节点,相同IO次数,检索出更多信息。

3)、B+树只在叶子节点存储数据 & 所有叶子结点包含一个链指针 & 其他内层非叶子节点只存储索引数据。只利用索引快速定位数据索引范围,先定位索引再通过索引高效快速定位数据。


B+树的优势:
因为B+树没有与内部节点相关联的数据,所以在内存页面上可以容纳更多的键。因此,访问叶子节点上的数据需要更少的缓存丢失。
B+树的叶节点是链接的,因此对树中的所有对象进行全面扫描只需要一个线性遍历所有叶节点。另一方面,B树需要遍历树中的每一层。这种全树遍历可能比B+叶子的线性遍历涉及更多的缓存丢失。


B树的优势:
因为B树包含每个键的数据,所以经常访问的节点可以更靠近根,因此可以更快地访问。

 

你可能感兴趣的:(mysql)