我们可以先给出答案,两种存储引擎都是基于B+树数据结构存储表数据的,但是区别在于InnoDB存储引擎中的B+树即存储了索引又存储了所有数据,而MyISAM中的B+树中只存储了索引的Key值地址,实际的数据存储在其他地方。
我们分别创建两张表,一张user表使用InnoDB存储引擎,一张配置表config使用MyISAM存储引擎,我们会发现两张表的存储文件格式不一样,user表有两个文件,对应如下:user.frm:表结构文件
user.ibd:索引和数据文件(InnoDB Data)
而config表有三个文件,对应如下:config.frm:表结构文件
config.MYD:数据文件(MyISAM Data)
config.MYI:索引文件(MyISAM Index)
通过以上文件,我们可以获知,InnoDB存储引擎的索引和数据都存储在一个文件中,而MyISAM存储引擎的索引和数据存储是分开的。
MyISAM
我们先来看看MyISAM存储引擎是如何使用B+树存储索引以及数据的。MyISAM引擎使用B+树作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图:
在MyISAM中,主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下 图所示:
InnoDB
虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。InnoDB的数据文件本身就是索引文件,表的主键索引这棵树的非叶子节点存储的是主键的key值,而叶节点data域保存了完整的数据记录:
InnoDB的辅助索引与主键的聚集索引类似,但是data域存储相应记录主键的值而不是地址。例如,下图为定义在Col2上的一个辅助索引:
小结
总结以上,MyISAM和InnoDB都是以B+树数据结构存储数据的,但MyISAM的数据文件和索引文件是分开的,InnoDB的数据文件就是索引文件。
MyISAM主索引中的B+树中,叶节点的data域存放的是数据记录的地址,而InnoDB中的叶子节点叶节点data域保存了完整的数据记录。
MyISAM辅助索引中的B+树中,叶节点的data域存放的是数据记录的地址,而InnoDB中的叶子节点叶节点data域保存的是主键的值。