MyISAM采用的是索引文件和数据文件分离存储,索引文件中存储的是数据文件中相应数据的地址,只对索引采取B+tree数据结构。
InnoDB使用的也是B+tree数据结构存储器引擎,但是和MyISAM差别比较大。首先InnoDB的数据文件本身就是索引文件。即数据文件就按照B+tree的结构存储,这棵树的key即是InnoDB中的主键,这棵树的叶结点对应的data域存储的是完整的数据记录。
这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键,对比MyISAM,MyISAM则不是非要主键,MyISAM的索引叫做非聚集索引,如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,
另外:
InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。
MyISM使用的是非聚簇索引,非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。
网友评论