从B树谈到数据库的索引实现原理

B树(B-tree):


具有以下性质:
m代表阶数
    1、根结点:至少有两个子女
    2、非根结点包含的关键字个数为 m/2-1 <= j <= m-1(3: 1<=j<=2)
    3、除根以外的内部结点个数 m/2 <= k <= m;
    4、根结点在同层
    5、每个节点的关键字都是有序的

B+树

与B树的区别在于:
    1、每个非叶结点都不保存数据
    2、优化后的B+树一般都包含叶子结点之间的指针,极大提高了区间查询效率
    3、所有非终端结点都可以看成是索引部分,结点中只包含其子树(根结点)中的最大(最小)值

MySQL索引实现

MyISAM索引实现

叶节点的data域存放的是数据记录的地址,MyISAM的索引文件仅仅保存数据记录的地址


主索引和辅助索引的唯一区别:
主索引要求key是唯一的,而辅助索引的key可以重复


MyISAM中索引检索的算法
首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。


InnoDB索引实现

MyISAM主要区别:
1、InnoDB的数据文件本身就是索引文件
2、 叶节点包含了完整的数据记录
3、 InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键
4、 如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形
5、 InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域
6、 辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录
下图为主键索引:
辅助索引:

猜你喜欢

转载自blog.csdn.net/aj1101/article/details/79422475