注:数据库引擎包括innodb,myisam,本篇主要针对innodb


一、底层数据结构

innodb数据库索引数据结构为B+Tree

我们查看数据文件存储位置

#登录数据库,进行查询
SHOW VARIABLES LIKE '%datadir%'

例如:我的mybatis_example库t_user表文件结构(t_user为innodb,可以看到只有一个文件:t_user.frm)

ibd数据结构 mysql mysql数据结构原理_子节点

ibd数据结构 mysql mysql数据结构原理_主键_02

t_user.frm的数据结构就是一棵索引树,最底下是表中存储的数据

特点

  1. 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
  2. 叶子节点包含所有索引字段
  3. 叶子节点之间用双向指针连接,提高区间访问的性能

下图为B+Tree结构

ibd数据结构 mysql mysql数据结构原理_子节点_03

以上为主节索引树结构,而普通索引或者二级索引则为下图(底层叶子节点存储的是主键索引)

ibd数据结构 mysql mysql数据结构原理_子节点_04

 

二、索引页

通俗来讲:计算机有磁盘预读功能,索引加载进内存,大小为16kb,我们称为mysql的索引页。

索引,总量大小固定,我们在创建表类型的时候,就要考虑数据类型,int占4byte,bigint占8byte,varchar字符串就比较占空间,所以建议主键索引为数字类型

4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节

考虑到,m层b+tree 每个节点最多m个节点,最少有m/2向上取整个节点,如果索引不是连续的,在删除和修改数据的时候,就要重构树结构,影响性能。

所以我们建议 ,索引最好是连续的。

索引页的大小也让我们考虑不用红黑树或者二叉树,每层只有两个索引值存,那样会增大树的高度,影响效率;

 

 

注:以上为本人总结,如有错误之处,望不吝指出,非常感谢!