数据库的索引是我们最常用的一种数据结构,可以帮我们快速、顺序的进行IO交互,高效获取到我们所需要的数据。那么索引的底层的格式是什么样?又是如何提升我们和磁盘间的IO交互的效率的呢?
索引介绍
- 什么是索引?
- 索引是帮助mysql高效获取数据的排好序的数据结构。
- 索引就像是一本书的目录,它能让你更快的找到自己想要的内容。
- 可以更加目的性的去获取数据,从而提高数据库检索数据的性能。
- 索引类型介绍
- 二叉树
- 红黑树
- hash
- B-Tree
各类数据结构索引之间的比较
- Hash
- 优点:
- 对索引的key进行一次hash计算就可以定位出数据存储的位置。
- 很多时候Hash索引要比B+ 树索引更高效。
- 时间复杂度O(1)
- 缺点:
- 仅能满足 “=”,“IN”,不支持范围查询。
- hash冲突问题。
- 优点:
使用hash数据结构作为索引的存储数据结构,在存储数据的时候会根据索引计算出的hash值来“填坑”式的绑定存储数据。如上图所示就会存在hash值碰撞的问题,俩个不同的数据hash值落在同一“坑位”,并且hash值随机的算法,在直接使用的范围型的查找方式时,不能在起到索引作用
-
二叉树
-
二叉查找树(BST,Binary Search Tree),也叫二叉排序树,在二叉树的基础上需要满足:任意节点的左子树上所有节点值不大于根节点的值,任意节点的右子树上所有节点值不小于根节点的值。如下是一颗BST:
-
当需要快速查找时,将数据存储在BST是一种常见的选择,因为此时查询时间取决于树高,平均时间复杂度是O(lgn)。然而,BST可能长歪而变得不平衡,如下图所示,此时BST退化为链表,时间复杂度退化为O(n)。
-
-
红黑树
-
红黑树并不追求严格的平衡,而是帮我们实现大致的平衡:只是确保从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。从实现来看,红黑树最大的特点是每个节点都属于两种颜色(红色或黑色)之一,且节点颜色的划分需要满足特定的规则。红黑树示例如下:
-
优点:
- 因为红黑树同时引入了颜色,当插入或删除数据时,只需要进行O(1)次数的旋转以及变色就能保证基本的平衡。
-
缺点:
- 红黑树长得还是太高了。当数据在磁盘中时,磁盘IO会成为最大的性能瓶颈,设计的目标应该是尽量减少IO次数;而树的高度越高,增删改查所需要的IO次数也越多,会严重影响性能。
-
-
B-Tree
- 非叶子节点也会保存数。
- 所有索引元素不重复,不存在冗余元素。
- 节点中的数据索引从左到右递增排列。
-
B+Tree
- 非叶子节点不存储data,只存储索引(冗余)可以放更多的索引
- 叶子节点包含所有索引字段
- 叶子节点用指针连接,提高区间访问的性能