MySQL-MyISAM和Innodb索引实现原理

MySQL索引实现

在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。

MyISAM索引实现

新建一张MyISAM引擎的表会生成三个文件,文件格式分别为:.frm、.MYD(存放数据)、.MYI(存放索引),这三个文件具体存放什么看下面的MyISAM索引原理图。

MyISAM引擎使用B+Tree作为索引结构,叶结点的value域存放的是数据记录的地址。下面是MyISAM索引的原理图

MySQL-MyISAM和Innodb索引实现原理_第1张图片

由上图可知,在MyISAM中,数据与索引是分开的,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。

 

InnoDB索引实现

新建一张InnoDB引擎的表会生成两个个文件,文件格式分别为:.frm、.bd,这两个文件具体存放什么看下面的InnoDB索引原理图。

虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶结点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。下面是Innodb索引的原理图

MySQL-MyISAM和Innodb索引实现原理_第2张图片

由上图可知,叶结点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。第二个与MyISAM索引的不同是InnoDB的辅助索引value域存储相应记录主键的值而不是地址。
 

 

 

你可能感兴趣的:(MySQL)