MyISAM和InnoDB实现B树索引方式的区别是什么?

InnoDB和MyISAM都使用B-tree(B树)作为索引结构,但在实现方式上,还是存在一些差异:

  1. 数据存储方式的差异:MyISAM的B-tree的节点存放的是行数据的地址。当我们通过索引查询时,MyISAM会根据索引指向的地址找到磁盘文件中的行数据。而InnoDB的主键索引的叶子节点直接存放了完整的行数据(即聚簇索引)。查找过程中,一旦主键索引查找到,就直接获取到了完整的行数据,不需要二次查找。而InnoDB的非主键索引(二级索引)的节点存放的是主键的值,根据非主键索引查找时,需要先找到主键的值,然后再通过主键的值去主键索引找,也就是说InnoDB的非主键索引查找需要走两遍B-tree。

  2. 区分主键索引与非主键索引:InnoDB区分主键索引与非主键索引(即二级索引),而MyISAM则不区分,这是因为InnoDB的数据文件是按照主键顺序进行存放的,这种存储方式被称为聚簇。

  3. 对于锁的支持:MyISAM只支持表级锁,不论进行何种操作,都会锁全表,而InnoDB支持行级锁及MVCC,对于高并发的操作,InnoDB会有更优秀的性能。

  4. 对于崩溃恢复的支持:MyISAM在崩溃时可能需要人工干预,而InnoDB能够自动恢复。

总结起来,InnoDB和MyISAM在索引实现方式上的主要差异在于数据存储方式和数据查询方式上,InnoDB的聚簇索引将主键和数据行保存在一起,这意味着按主键的搜索可以在一次磁盘I/O中完成,而MyISAM需要两次I/O,一次是为了获取索引,一次是为了获取实际的行数据。

发表评论

后才能评论